スクリプトで Shift 文を使用する

スクリプトで Shift 文を使用する

私はbashスクリプトを見ており、以下の内容、主にステートメントを理解したいと思いますshift。実際に何をしていますか?

while [ $# -gt 0 ]; do
    case "$1" in
        --mirror)
            mirror="$2"
            shift
            ;;
        --dry-run)
            DRY_RUN=1
            ;;
        --*)
            echo "Illegal option $1"
            ;;
    esac
    shift $(( $# > 0 ? 1 : 0 ))
done

答え1

スクリプトのパラメータは位置パラメータとして表示されます。$1、、$2...shift最初のパラメータを削除し、残りのパラメータを左に移動します。したがって引数がfoo、、barであれば変換後の引数は、dooとなりますbardooShiftパラメーターは、移動するステップの数を示します。shiftと同じパラメータはありませんshift 1

このようなループの一般的な形式は次のとおりです。

while [ $# -gt 0 ]; do 
    # work with $1...
    shift
done

$#数値を含む引数がある限り、ループは続きます。ループを繰り返すたびに最初の引数をチェックし、最後のシフトではそれを削除して次の引数に移動します。

コードでは、最後のシフトには0より大きい条件付きパラメータが必要です。つまり、$(( $# > 0 ? 1 : 0 ))パラメータが残っていればそうなります。通常、これはループに入る前に同じことを確認したので解決されます。1$#01

ただし、スクリプトが--mirror最後のパラメータの場合、for ブランチの移動により--mirrorスクリプトが削除され、パラメータは残りません。以降の操作はshift 1失敗して返されます。ここの条件はこれを防ぎます。set -e各コマンドが失敗したことを確認するを使用してスクリプトを実行しない限り、エラーは重要ではありません。

関連情報