私は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
となりますbar
。doo
Shiftパラメーターは、移動するステップの数を示します。shift
と同じパラメータはありませんshift 1
。
このようなループの一般的な形式は次のとおりです。
while [ $# -gt 0 ]; do
# work with $1...
shift
done
$#
数値を含む引数がある限り、ループは続きます。ループを繰り返すたびに最初の引数をチェックし、最後のシフトではそれを削除して次の引数に移動します。
コードでは、最後のシフトには0より大きい条件付きパラメータが必要です。つまり、$(( $# > 0 ? 1 : 0 ))
パラメータが残っていればそうなります。通常、これはループに入る前に同じことを確認したので解決されます。1
$#
0
1
ただし、スクリプトが--mirror
最後のパラメータの場合、for ブランチの移動により--mirror
スクリプトが削除され、パラメータは残りません。以降の操作はshift 1
失敗して返されます。ここの条件はこれを防ぎます。set -e
各コマンドが失敗したことを確認するを使用してスクリプトを実行しない限り、エラーは重要ではありません。