【问题标题】:When should I double-quote a parameter expansion? [duplicate]我什么时候应该双引号一个参数扩展? [复制]
【发布时间】:2019-07-28 03:20:59
【问题描述】:

假设我有一个变量x。扩容的时候应该用$x还是"$x"

(这旨在作为任何围绕未引用参数扩展的问题的规范副本。)

【问题讨论】:

标签: bash sh


【解决方案1】:

总是使用"$x",至少一开始是这样。正确的情况多于可能错误的情况。

参数扩展受分词和路径名扩展的影响,这两种扩展都是您通常不想要的。引用扩展会保留参数的文字内容。

比较

$ 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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-10-07
  • 2013-10-31
  • 2016-11-30
  • 2011-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多