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

时间:2019-03-06 12:45:23

标签: bash sh

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

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

1 个答案:

答案 0 :(得分:7)

始终至少在开始时使用"$x" far 正确的情况要多于可能错误的情况。

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

比较

$ x="foo * bar"
$ printf '%s\n' "$x"
foo * bar

$ printf '%s\n' $x
foo
<every file in the current directory>
bar

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

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


作为推论,永远没有理由使用${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