shift; shift
bash를 사용하는 것보다 더 나은 문장을 발견했지만 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`
그런 다음 나중에 인수 없이 제공하면 -f
Bash가 무한 루프에 빠지게 됩니다. double의 경우 빈 문자열로 shift
설정되어 나중에 더 의미 있는 오류(예: "파일을 찾을 수 없음")가 발생할 수 있습니다. file
물론 $2
이것은 설정 또는 사용 여부를 확인하여 더 정확하게 수행할 수 있지만 getopt
무엇이든 가능합니다.
답변2
shift 2
두 개 이상의 위치 인수가 있는 경우 두 shift
.
위치 인수가 하나만 있으면 shift 2
값이 목록 밖으로 이동되지 않고 0이 아닌 종료 상태로 종료됩니다. 반면에 shift
두 번 실행하면 첫 번째 목록에서 값이 분명히 제거됩니다 shift
. 두 번째 항목은 shift
여전히 0이 아닌 종료 상태로 종료됩니다.