Bash の実行行内の条件をロードする

Bash の実行行内の条件をロードする

変数の属性に依存するオプションを使用してコマンドを実行したいです。変数が設定されている場合は、値を持つオプションをロードしますが、設定されていない場合はそのオプションをロードしません。これが私の持っているものです:

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と を追加します。$variableopts

  • 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 に奇妙な文字が出現しても堅牢です。

関連情報