条件によって決定されたオプションでコマンドを実行する

条件によって決定されたオプションでコマンドを実行する

私はユーザーにいくつかの質問をし、ユーザーの選択に応じていくつかのオプションまたは他のオプションを使用して最終コマンドを発行するシェルスクリプトを作成しようとしています。これでスクリプトは次のようになります。

if [[ $a == "y" ]] ; then

    command --option 1 argument

elif [[ $a == "n" ]] ; then

    command --option 2 argument

else

    command --option 3 argument

fi

コマンドがかなり長く、ステートメントごとに同じままのオプションとパラメータがたくさん含まれていることを考えると、条件がtrueの場合、変数オプションのみを考慮する行を何とか作成できるかどうか疑問に思います。

GNU parallelこれは、1つ以上のコマンドを実行するためにも機能します。

if [[ $b == "n" ]] ; then

    find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument

else

    find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument\; command2 --option argument

答え1

もちろん、変数を渡すオプションを保存することもできます。最初の例は次のとおりです([[POSIXシェルでは利用できないbash機能でもあります)。

if [[ $a == "y" ]] ; then
    arg=1
elif [[ $a == "n" ]] ; then
    arg=2
else
    arg=3
fi

command --option "$arg" argument

2番目の例:

if [[ $b != "n" ]] ; then
    extra="; command2 --option argument"
fi

find ./ -name '*.extension' | parallel -j $(nproc) command1 --option argument$extra
# if unset, $extra will be empty—you can of course explicitly
# set it to '' if this bothers you.

これらの操作が機能する理由は、変数拡張がどのように機能するかによるものです。つまり、コマンドラインに置き換えて(引用符がない場合)、トークン化してコマンドに渡します。したがって、呼び出されたコマンドは変数についてはまったくわからないため、シェルは変数を呼び出す前に変数を拡張します。

Bashを使用しているので、配列を使用することもできます。

args=()

if [ -n "$OPT_LONG" ]; then
    args+=(-l)
fi

if [ -n "$OPT_SORT_TIME" ]; then
    args+=(-t)
fi

ls "${args[@]}"

配列関数を使用すると、コードが破損するトークン化を心配することなく、ランダムに長いパラメータのリストを簡単に作成できます。

関連情報