条件付きでスクリプトにパラメータを渡す

条件付きでスクリプトにパラメータを渡す

Linux 上でいくつかのパラメータを受け入れるスクリプトを実行しています。
次のようなことを実行したいと思います。

if [[ $CONDITION == "true" ]]; then  
  script param1 --param2  
else
  script param1  
fi 

if の分岐パスを避けたいのですが、
2 番目のパラメータを渡すより最適な方法はありますか?

答え1

最も拡張可能で堅牢な方法は、おそらく配列を使用してオプションのパラメータを保持することです。

params=()
if [[ $CONDITION == true ]]; then
    params+=(--param2)
fi
script param1 "${params[@]}"

または略記すると:

[[ $CONDITION == true ]] && params+=(--param2)
script param1 "${params[@]}"

これにより、コマンドの定数部分の繰り返しが回避され、コマンド全体であっても、配列に複数の引数を配置できるようになります。

これを配列で行うことが重要であることに注意してください。配列を通常の変数 ( params="--param2"; script param1 $params) に置き換える場合は、変数を引用符なしで展開するか (それに伴うすべての問題が発生する)、引用符付きで展開する必要があります。後者の場合、変数が空であれば、引数として空の文字列を渡すことになります。

このような単純なケースでは、「代替値」展開も使用できます。

cond=x
p2="--param2"
script param1 ${cond:+"$p2"}

ここで、 が空でない場合( ではなく またはでcondあるかどうかに関係なく)、 の値が展開されます。これは配列よりも見栄えが良いように見えるかもしれませんが、引用符の配置には注意してください。cond=falsecond=0cond=truep2

参照:

答え2

これを行う汎用的な方法は、引数を配列に設定することです。最も基本的な配列は、 で定義された位置パラメータのリストですset。パラメータのリストを順番に構築できます。

set -- param1
if [[ $CONDITION == "true" ]]; then  
    set -- "$@" --param2  
fi 

command "$@"  

これは次のように要約できます。

set -- param1
[[ $CONDITION == "true" ]] && set -- "$@" --param2
command "$@"  

位置パラメータのリストを保持する必要がある場合は、次のいずれかを実行します。

  • 関数を使用する:

    callcommand(){     set -- param1
                       [[ $CONDITION == "true" ]] && set -- "$@" --param2
                       command "$@"       
                 }
    callcommand
    
  • または、他の配列変数を使用します。

    paramArray=()
    paramArray+=(param1)
    [[ $CONDITION == "true" ]] && paramArray+=( "--param2" )
    command "${paramArray[@]}"
    

答え3

PARAMS+=" param1"
if [[ $CONDITION == "true" ]]; then  
  PARAMS+=" --param2"
fi
script ${PARAMS}

関連情報