说我有一个变量x
。扩展它时,应该使用$x
还是"$x"
?
(这旨在作为围绕无引号参数扩展的任何问题的规范重复。)
答案 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