Bash 如何处理双引号内的括号?

spa*_*c24 4 bash shell escaping sh double-quotes

问题基本上是,bash 如何处理双引号和括号?

我无法想出更好的例子,所以对此表示歉意,但想象一下这样的事情:

"$(echo "${foo}")"

那里会发生什么?技术上是否${foo}超出报价范围?bash 是否足够聪明,能够考虑它在括号内并从内向外工作?效果会\"${foo}\"更好吗?

我试过用谷歌搜索这个,但没有运气。请注意,这与嵌套引用问题不同,因为它包括扩展。

谢谢!

Tom*_*ech 5

每个命令替换都会建立一个新的引用上下文,因此避免嵌套命令替换内分词的正确方法是使用双引号。

在此示例中,保留空白:

$ echo "$(echo "$(echo 'foo     bar')")" # outer echo sees 'foo     bar'
foo     bar
Run Code Online (Sandbox Code Playgroud)

然而,缺少任何双引号意味着该字符串被 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
Run Code Online (Sandbox Code Playgroud)

echo输出每个参数,用空格分隔,这就是“foo”和“bar”之间的单个空格的来源。