查找空间逃生

时间:2017-02-05 10:57:06

标签: string bash escaping

在bash中编写一个小脚本(事实上是MacOS),我想使用 find ,有多个来源。通常不是问题,但要搜索的源目录列表在变量中保存为字符串。同样,通常不是问题,但其中一些在其名称中包含空格。

我可以构造完整的命令字符串,如果直接在命令提示符下输入(实际上是复制和粘贴),它可以按需要和预期工作。但是当我尝试在脚本中运行它时,它会在名称空间中消失,我无法解决这个问题。

我无法引用整个源代码字符串,因为它只被视为一个单独的项目,当然不存在。我在变量中保存的字符串中使用反斜杠转义每个空格,它就会丢失。如果我使用双反斜杠,它们都会保留在原位并再次失败。我试过的任何引用方法基本上都被忽略了,引号被视为普通字符,并且在每个空格处完成分割。

到目前为止,我只能在整个命令字符串中使用 eval 来使其工作,但我觉得应该有比这更好的解决方案。

具有讽刺意味的是,如果我使用AppleScript,我可以创建一个合适的命令字符串并使用doShellScript完美运行(好吧,使用JXA,但它与实际的AppleScript相同)。但是,到目前为止,我还没有在bash脚本中找到正确的转义机制,而没有求助于eval。

有人建议解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果可能,请勿将所有路径存储在一个字符串中。阵列更安全,更方便:

paths=("first path" "second path" "and so on")
find "${paths[@]}"

find命令将扩展为

find "first path" "second path" "and so on"

如果你必须使用字符串而不想在数组中使用eval,split the string

string="first\ path second\ path and\ so\ on"
read -a paths <<< "$string"
find "${paths[@]}"

字符串内的路径应使用\来逃避空格;在""''内包装路径不起作用。 eval可能是更好的选择。