Shift; Bash를 사용할 때 Shift 대 Shift 2

Shift; Bash를 사용할 때 Shift 대 Shift 2

shift; shiftbash를 사용하는 것보다 더 나은 문장을 발견했지만 shift 2설득력 있는 설명이 필요합니다. shift; shift위치 매개변수가 전달되는 방식에 문제가 있으면 어떻게 되며 문제를 더 잘 처리할 수 있는 방법은 무엇입니까?

답변1

shift 2위치 인수가 하나만 있으면 실패합니다.나뭇잎매개변수는 다음과 같습니다.

$ 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두 개 이상의 위치 인수가 있는 경우 두 shift.

위치 인수가 하나만 있으면 shift 2값이 목록 밖으로 이동되지 않고 0이 아닌 종료 상태로 종료됩니다. 반면에 shift두 번 실행하면 첫 번째 목록에서 값이 분명히 제거됩니다 shift. 두 번째 항목은 shift여전히 ​​0이 아닌 종료 상태로 종료됩니다.

관련 정보