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

时间:2017-07-31 09:01:04

标签: bash shell escaping sh double-quotes

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

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

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

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

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

谢谢!

3 个答案:

答案 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"

在上面,$foocmd的输出是安全的,但如果cmd包含$()内的另一个变量,则需要引用该变量。

答案 2 :(得分:-1)

什么是foo?这是一个价值吗?尝试

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