问题基本上是,bash如何处理双引号和括号?
我无法想出一个更好的例子,所以对此表示道歉,但想象一下这样的事情:
"$(echo "${foo}")"
那里发生了什么? ${foo}
技术上是否超出报价范围? bash是否足够聪明,还要考虑它是在括号内并从内到外工作? \"${foo}\"
会更好吗?
我试过谷歌搜索这个,但没有运气。请注意,这与嵌套的引用问题不同,因为它包括扩展。
谢谢!
答案 0 :(得分:2)
每个命令替换都会建立一个新的引用上下文,因此在嵌套命令替换中避免单词拆分的正确方法是使用双引号。
在此示例中,将保留空格:
$ echo "$(echo "$(echo 'foo bar')")" # outer echo sees 'foo bar'
foo bar
但是,缺少任何双引号意味着该字符串由shell分割:
$ echo $(echo "$(echo 'foo bar')") # outer echo sees 'foo' 'bar'
foo bar
$ echo "$(echo $(echo 'foo bar'))" # middle echo sees 'foo' 'bar'
foo bar
echo
输出每个参数,用空格分隔,这是" foo"之间的单个空格。和" bar"来自。
答案 1 :(得分:2)
您提供的示例可以完全避免分词:
"$(echo "${foo}")"
而,
"$(echo ${foo})"
可以避免输出中的单词拆分,但不会保存变量$foo
。
$()
打开一个子shell,你需要在这个子shell中引用你的变量。请考虑以下示例:
"$(echo "$(echo "$foo")")"
上面的引号都不是可选的,如果你错过任何引号,你将受到分词的限制。
考虑另一个例子:
"$foo var in same shell, $(cmd) - this output is also in the same shell"
在上面,$foo
和cmd
的输出是安全的,但如果cmd包含$()
内的另一个变量,则需要引用该变量。
答案 2 :(得分:-1)
什么是foo?这是一个价值吗?尝试
"$(echo "$\{foo\}")"