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

How does Bash deal with brackets inside of double quoting?

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

我想不出更好的例子,对此深表歉意,但想象一下这样的事情:

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

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

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

谢谢!

什么是富?它是一个值吗?尝试

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

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

在这个例子中,白色 space 被保留:

$ 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 输出每个参数,由 space 分隔,这是 "foo" 和 "bar" 之间的单个 space 的来源。

你给出的例子确实让你完全免于分词:

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

"$(echo ${foo})"

将使您免于在输出上进行分词,但不会在变量 $foo 上进行分词。

$() 打开一个子 shell,你也需要在这个子 shell 中引用你的变量。考虑以下示例:

"$(echo "$(echo "$foo")")"
以上引号中的

None是可有可无的,漏掉任何一条,都会被分词。

考虑另一个例子:

"$foo var in same shell, $(cmd) - this output is also in the same shell"

在上面,$foocmd的输出是安全的,但是如果cmd在$()中包含另一个变量,那么这个变量就需要被引用。