【问题标题】:Find space escape寻找太空逃生
【发布时间】:2017-02-05 10:57:06
【问题描述】:

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

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

我不能引用整个源字符串,因为它只会被视为一个当然不存在的单个项目。我在变量中保存的字符串中用反斜杠转义每个空格,它只是丢失了。如果我使用双反斜杠,它们都会保持原位,但又会失败。我尝试过的任何引用方法基本上都被忽略了,引号被视为普通字符,并且在每个空格处进行拆分。

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

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

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

【问题讨论】:

  • 用更少的文字和更多的代码来显示有问题的部分会更好......
  • 如果您阅读单词有困难,我很抱歉。

标签: string bash escaping


【解决方案1】:

如果可能,不要将所有路径存储在一个字符串中。数组更安全、更方便:

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 可能是这里更好的选择。

【讨论】:

  • 但正如我所说,路径(嗯,只是目录名称)是一个字符串,而不是一个数组。
  • @UKenGB 抱歉,您的问题对我来说不是很清楚。您能否准确描述它们是如何存储在字符串中的。举个例子。格式是"first path" "second path" 还是first\ path second\ path 还是first path second path
  • 对于 Apple/JavaScript,它们被存储为 'iTmeDIRS = 'Audiobooks Home\\ Videos Movies Music Podcasts TV\\Shows',并且 iTmeDIRS 可以输入到 find 命令以用作源目录要搜索的。这行得通。但是我无法在 bash 脚本中找到将目录列表存储在变量中的方法,该变量可以以与 find 命令相同的方式使用。但是我尝试引用/转义名称中的空格,它根本失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
  • 2019-04-19
相关资源
最近更新 更多