什么时候应该双引号参数扩展?

che*_*ner 4 bash sh

说我有一个变量x。扩展时,我应该使用$x还是"$x"

(这旨在作为围绕无引号参数扩展的任何问题的规范重复。)

che*_*ner 7

"$x"至少一开始总是使用。正确的情况远远超过错误的情况。

参数扩展同时受单词拆分和路径名扩展的约束,您通常都不需要。引用扩展保留参数的文字内容。

比较

$ x="foo * bar"
$ printf '%s\n' "$x"
foo * bar
Run Code Online (Sandbox Code Playgroud)

$ printf '%s\n' $x
foo
<every file in the current directory>
bar
Run Code Online (Sandbox Code Playgroud)

如果您的逻辑确实需要进行单词拆分或路径名扩展,则很有可能需要更改脚本设计以避免该要求。

始终引用参数扩展至少会减少您需要修复的错误的数量。


因此,从来没有理由使用无${foo[@]}引号。@索引的存在是*在引用时具有特殊的行为(与索引相比)。如果不加引号,则两者是相同的,因此您最好使用${foo[*]}

相同的参数适用于特殊参数$@$*

$ x=("foo bar" baz)
$ printf '%s\n' "${x[@]}"  # expands to two elements words, one per element
foo bar
baz
$ printf '%s\n' "${x[*]}"  # expands to one word; elements join using IFS
foo bar baz
$ printf '%s\n' ${x[*]}    # expands to three words
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)