POSIXシェルスクリプトで条件付きでパラメータを渡す方法は?

POSIXシェルスクリプトで条件付きでパラメータを渡す方法は?
#!/bin/sh
echo "Noise $1"
echo "Enhancement $2"
for snr in 0 5 10 15 20 25
do
  python evaluate.py --noise $1 --snr 25 --iterations 1250 --enhancement $2
done

指定しない場合は、Pythonスクリプトに$2引数を渡したくありません。--enhancement $2どうすればいいですか?

ベストアンサー1

元のスクリプトを変更します。

#!/bin/sh
echo "Noise $1"
echo "Enhancement $2"
for snr in 0 5 10 15 20 25
do
  python evaluate.py --noise "$1" --snr "$snr" --iterations 1250 ${2:+--enhancement "$2"}
done

標準パラメータ拡張 ${var:+word}word変数がvar設定されていて空でない場合は展開されます。上記のコードは、使用可能で空でない--enhancement "$2"場合にそれをコマンドに追加するために使用します。$2

--snrまた、オプション引数として提供することがループ変数の値でなければならないとします。


コードに対する私の個人的な意見(主に代わりprintfに使用しecho、長い行を避け、コードに詳細を提供します):

#!/bin/sh

printf 'Noise %s\n' "$1"
printf 'Enhancement %s\n' "$2"

for snr in 0 5 10 15 20 25; do
    python evaluate.py \
        --noise "$1" \
        --snr "$snr" \
        --iterations 1250 \
        ${2:+--enhancement "$2"}
done

mosvyが以下の説明で指摘したように:/bin/shシェルの場合、または新しいシェルセッションの開始時に他のシェルが正しくリセットされない場合dash(POSIXで必要)、何らかの理由でエクスポートしてIFS提供IFSしてください。デフォルト以外の値の場合は、上記のスクリプトのunset IFS一番上で使用できます。

修正するたびにこれを行うIFS輸出によって疑われる余地なく提起されるその他の問題(エクスポートしないでくださいIFS)。

おすすめ記事