我有一个脚本,我用它检查过shellcheck
。对于一个命令,我将参数/标志作为字符串传递,并且 shellcheck 抱怨它,即我执行以下操作
options="-j 5 -B"
make $options file
相反,他们 [1] 建议执行以下操作,但没有明确提及为什么这样做更好
options=(-j 5 -B) # ksh: set -A options -- -j 5 -B
make "${options[@]}" file
为什么后一个例子比前一个例子更好?
答案1
在简单的情况下,这并不重要。
如果某些选项需要引用,请考虑:
options=(-j 5 "Hello, World" -B)
make "${options[@]}" file
这四个元素在数组初始化中被正确引用,并且数组替换使它们正确地成为不同的单词。
一步替换无法用部分引号修复(即使在字符串周围使用单引号)。它要么是一种选择,要么是五种选择:决不是四种选择。
paul $ options="-j 5 'Hello, World' -B"
paul $ declare -p options
declare -- options="-j 5 'Hello, World' -B"
paul $ printf '%s\n' $options
-j
5
'Hello,
World'
-B
$ printf '%s\n' "$options"
-j 5 'Hello, World' -B
$
相比:
paul $ options=(-j 5 "Hello, World" -B)
paul $ declare -p options
declare -a options='([0]="-j" [1]="5" [2]="Hello, World" [3]="-B")'
paul $ printf '%s\n' "${options[@]}"
-j
5
Hello, World
-B
paul $