스크립트에서 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가 됩니다 bar. dooShift 매개변수는 이동할 단계 수를 나타냅니다. 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각 명령이 실패했는지 확인하는 를 사용하여 스크립트를 실행하지 않는 한 오류는 중요하지 않습니다 .

관련 정보