Shift; Bashを使用すると、Shift対Shift 2

Shift; Bashを使用すると、Shift対Shift 2

shift; shiftbashを使うよりも良い文を見つけましたが、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`

その後、後で引数なしで提供すると、-fBashは無限ループに陥ります。 doubleの場合は空の文字列にshift設定され、後でより意味のあるエラー(「ファイルが見つかりません」など)が発生する可能性があります。fileもちろん、$2これを設定するかどうかを確認することでより正確に行うことができますが、getopt何でも可能です。

答え2

shift 2複数の位置引数がある場合は2つshift

位置引数が 1 つしかない場合、shift 2値はリストから移動されず、ゼロ以外の終了状態で終了します。一方、shift2回実行すると、最初のリストから値が明らかに削除されますshift。 2番目のエントリはshiftまだゼロ以外の終了状態で終了します。

関連情報