文字列として渡される引用パラメータ

文字列として渡される引用パラメータ

で確認したスクリプトがあります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

4つの要素は配列初期化で正しく参照され、配列置換はその要素を正しく別の単語にします。

1 段階の置換は、部分引用符 (文字列の周りに単一引用符がある場合でも) では変更できません。選択肢は1つまたは5つです。決して4つの選択ではありません。

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 $ 

関連情報