shift; shift
bashを使うよりも良い文を見つけましたが、shift 2
説得力のある説明が必要です。shift; shift
位置パラメータが渡される方法に問題がある場合はどうなり、問題をより適切に処理できるのですか?
答え1
shift 2
位置引数が1つしかない場合は失敗します。葉パラメータは次のとおりです。
$ set -- abc
$ shift; shift
$ echo "exit status $? args left $# first arg expands to '$1'"
exit status 1 args left 0 first arg expands to ''
$ set -- abc
$ shift 2
$ echo "exit status $? args left $# first arg expands to '$1'"
exit status 1 args left 1 first arg expands to 'abc'
shift
どちらの場合も、最新のシャットダウンが失敗したため、両方ともシャットダウンステータス1を表示します。最初のケースでは、最初のケースではshift
個々の位置パラメータがクリアされました。
それがバッシュのことです。一部のシェルでは、実際の数よりも多くの位置引数を移動しようとすると、シェルがエラーで終了する可能性があります。
$ dash -c 'set -- abc; shift 2; echo end'
dash: 1: shift: can't shift that many
これはパラメータ解析ループで発生する可能性があります。例えば
while [ "$#" -gt 0 ]; do
# ...
if [ "$1" = -f ]; then
file=$2
shift 2;
fi
done`
その後、後で引数なしで提供すると、-f
Bashは無限ループに陥ります。 doubleの場合は空の文字列にshift
設定され、後でより意味のあるエラー(「ファイルが見つかりません」など)が発生する可能性があります。file
もちろん、$2
これを設定するかどうかを確認することでより正確に行うことができますが、getopt
何でも可能です。
答え2
shift 2
複数の位置引数がある場合は2つshift
。
位置引数が 1 つしかない場合、shift 2
値はリストから移動されず、ゼロ以外の終了状態で終了します。一方、shift
2回実行すると、最初のリストから値が明らかに削除されますshift
。 2番目のエントリはshift
まだゼロ以外の終了状態で終了します。