如何在bash脚本中转义文件路径中的空间

如何在bash脚本中转义文件路径中的空间,bash,Bash,我有一个bash脚本,它需要遍历iOS设备目录中的文件并逐个删除文件。 要从命令行列出文件,我使用以下命令: ios-deploy --id UUID --bundle_id BUNDLE -l | grep Documents 为了逐个处理每个文件,我在脚本中使用以下for循环 for line in $(ios-deploy --id UUID --bundle_id BUNDLE -l | grep Documents); do echo "${line}" done 现在的

我有一个bash脚本,它需要遍历iOS设备目录中的文件并逐个删除文件。 要从命令行列出文件,我使用以下命令:

ios-deploy --id UUID --bundle_id BUNDLE -l | grep Documents
为了逐个处理每个文件,我在脚本中使用以下for循环

for line in $(ios-deploy --id UUID --bundle_id BUNDLE -l | grep Documents); do
     echo "${line}"
done
现在的问题是,有些文件的名称中有空格,在这种情况下,for循环将它们视为两行


如何在for循环定义中转义空白,使每个文件都有一行?

这可能会解决您的问题:

while IFS= read -r -d $'\n'
do
  echo "${REPLY}"
done < <(ios-deploy --id UUID --bundle_id BUNDLE -l | grep Documents)
而IFS=read-r-d$'\n
做
回显“${REPLY}”

完成<您可以添加
IFS=$'\n'
使换行符成为
for
循环的
之前唯一的分隔符。@Ardit实际上不起作用:@Ardit,…假设返回的输出包含字符串
Documents/*.xyz
。如果您的
for line in$(ios deploy…| grep Documents)
与之一起运行,并且没有与glob匹配的
文档/*.xyz
文件存在,则如果
failglob
处于活动状态,脚本将失败,或者如果
nullglob
处于活动状态,脚本将完全忽略该行。。。如果确实存在任何匹配项,那么您将返回匹配文件的列表,而不是来自
iosdeploy
的文本输出。总体上回答得不错。有几点疑问:
$'\n'
-d
的默认值,因此不需要严格使用它
REPLY
作为默认目的地是bashism,因此养成实际提供显式变量名的习惯是有价值的。感谢您提供的提示,同意,我将其添加到了answer中。
while IFS= read -r line
do
  echo "${line}"
done < <(ios-deploy --id UUID --bundle_id BUNDLE -l | grep Documents)