私はユーザーにいくつかの質問をし、ユーザーの選択に応じていくつかのオプションまたは他のオプションを使用して最終コマンドを発行するシェルスクリプトを作成しようとしています。これでスクリプトは次のようになります。
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[@]}"
配列関数を使用すると、コードが破損するトークン化を心配することなく、ランダムに長いパラメータのリストを簡単に作成できます。