変数の属性に依存するオプションを使用してコマンドを実行したいです。変数が設定されている場合は、値を持つオプションをロードしますが、設定されていない場合はそのオプションをロードしません。これが私の持っているものです:
if [ -n "$variable" ]
then command ... -option $variable
else command ...
fi
アイデアとしては、コマンドの他のオプションを 2 回繰り返さなくても済むように、これを条件付きの単一のコマンドにマージすることです。
お時間をいただきありがとうございました。
答え1
bash 配列の使用:
opts=()
[ "$variable" ] && opts+=(-option "$variable")
command ... "${opts[@]}"
$variable
これは bash 配列を使用するため、空白やその他の難しい文字が含まれていても機能します。
使い方
opts=()
これにより、 という空の配列が作成されます
opts
。[ "$variable" ] && opts+=(-option "$variable")
$variable
が空でない場合は、配列に-option
と を追加します。$variable
opts
command ... "${opts[@]}"
これはコマンドを実行します。
opts
が空でない場合は、その要素がコマンドに追加されます。 が空の場合は、何も追加されません。 がまったく存在しないopts
のと同じです。"${opts[@]}"
答え2
次に、コマンドを次のように関数にします。
function command_function () {
command ... -option $variable
}
if [ -n "$variable" ]
then command_function ... -option $variable
else command_function ...
fi
ご存知のとおり、Bash 関数内の括弧は何も渡しません。
答え3
使用バッシュ置換(シェルパラメータ展開) を使用すると、簡潔で読みやすい構文になります。
$ echo ${variable:+-option $variable}
$ variable=yes
$ echo ${variable:+-option $variable}
-option yes
答え4
次のワンライナーで十分です。
[ x"$VARIABLE" = x ] && echo UNSET || echo SET
これは変数x"$変数"等しいバツつまり、$変数空です。テストが満たされた場合、最初のオプション(エコーUNSET)が実行され、テストがない最後のオプションが実行される(エコーSET)。2番目のケースで何もしたくない場合は、
[ x"$VARIABLE" = x ] && echo UNSET || :
これは他のソリューションよりもかなり単純で、条件の評価を 1 回だけ実行でき、VARIABLE に奇妙な文字が出現しても堅牢です。