私はを持つbashスクリプトを書いていてset -u
、空の配列の展開に問題があります。bashは、展開中に空の配列を未設定の変数として扱うようです。
$ set -u
$ arr=()
$ echo "foo: '${arr[@]}'"
bash: arr[@]: unbound variable
(declare -a arr
どちらも役に立ちません。)
これに対する一般的な解決策は、${arr[@]-}
代わりに使用することです。したがって、(「未定義」)空の配列の代わりに空の文字列に置き換えます。ただし、これは適切な解決策ではありません。単一の空の文字列が含まれている配列と空の配列を区別できないためです。(@ -expansionはbashで特別であり、に展開"${arr[@]}"
される"${arr[0]}" "${arr[1]}" …
ため、コマンドラインを構築するための完璧なツールになります。)
$ countArgs() { echo $#; }
$ countArgs a b c
3
$ countArgs
0
$ countArgs ""
1
$ brr=("")
$ countArgs "${brr[@]}"
1
$ countArgs "${arr[@]-}"
1
$ countArgs "${arr[@]}"
bash: arr[@]: unbound variable
$ set +u
$ countArgs "${arr[@]}"
0
それで、その中の配列の長さをチェックするif
(以下のコードサンプルを参照)か-u
、その短い部分の設定をオフにする以外に、その問題を回避する方法はありますか?
if [ "${#arr[@]}" = 0 ]; then
veryLongCommandLine
else
veryLongCommandLine "${arr[@]}"
fi
更新:bugs
池上さんの説明でタグを削除しました。
"${arr[@]}"
。何か不足していますか?私が見ることができるものから、それは少なくともで動作し5.x
ます。