引用作为字符串传递的参数

引用作为字符串传递的参数

我有一个脚本,我用它检查过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]https://github.com/koalaman/shellcheck/wiki/SC2086

答案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 $ 

相关内容