나는 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
각 명령이 실패했는지 확인하는 를 사용하여 스크립트를 실행하지 않는 한 오류는 중요하지 않습니다 .