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"
在上面,$foo
和cmd
的输出是安全的,但是如果cmd在$()
中包含另一个变量,那么这个变量就需要被引用。
问题基本上是,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"
在上面,$foo
和cmd
的输出是安全的,但是如果cmd在$()
中包含另一个变量,那么这个变量就需要被引用。