我需要将存储在变量中的字符串传递给查找命令字符串。
我所做的:
s="\( ! -path \"/path/to/1/Recycle Bin\" \) -or"
s="${s} \( ! -path \"/path/to/2/Recycle Bin\" \)"
exec=$(find "/path/to/Recycle Bin" -type d $s)
结果:
find: paths must precede expression: `\('
如果我做:
exec=$(find "/path/to/Recycle Bin" -type d \( ! -path "/path/to/1/Recycle Bin" \) -or \( ! -path "/path/to/2/Recycle Bin" \))
有用。
我究竟做错了什么?
如果您的变量可能不包含您认为的内容,请使用
查看每次扩展的结果。
shell 处理命令中的反斜杠和双引号
find
,但它在扩展变量时并没有以相同的方式处理它们......在命令行上,我们写:
如果你已经运行过
set -x
,你可以看到 Bash 对此做了什么以及实际传递给了什么find
:不会发生对变量的引号删除(您将
\
and"
字符放在那里,所以您希望它们保留,对吗?这些字符是“由扩展引起的”,因此它们不会被删除)(\"
当"
您分配它时可能会变成打算是因为在双引号中反斜杠引用了 chars\$`"
),但 wordplitting 确实:引用变量修复了错误的分词,但也防止了标记化:
几乎你对这两个字符串所做的任何事情都会导致
find
看到错误的东西。让你的变量只包含一个扩展为的字符串'(' '!' -path '/path/to/1/Recycle Bin' ')' -or '(' '!' -path '/path/to/2/Recycle Bin' ')'
是我个人无法赢得的报价战。像这样的东西会很好用
如果您通过不使用带空格的路径来消除引用的需要,您也可以摆脱它 - 如果您取出反斜杠和双引号:
也许如果您解释为什么要这样做,有人可以提出更好的解决方法。
恕我直言,在 bash 中执行此操作的唯一可靠方法是使用数组。
正确引用的数组允许您构建一个命令行,该命令行由可包含空格的单独可解析参数组成。
前任。
我们可以通过打印出单个元素(每行一个)来查看 shell 会看到什么: