쉘 명령을 설명하십시오 : shift $ (($ optind-1))


30

나는 Linux 사람이 아니지만 내 프로젝트에서 읽어야 할 스크립트에 갇혀 있습니다. 누구든지이 명령이 무엇을하는지 도와 줄 수 있습니까?

shift $(($optind - 1))

3
아래에 언급 된 것처럼 OPTIND는 대문자 여야하며 괄호 안의 '$'는 선택 사항입니다.
DarkHeart

답변:


49

shift $((OPTIND-1))(참고 OPTIND는 대문자입니다)는 일반적으로 getopts while루프 직후에 발견 됩니다. $OPTIND에서 찾은 옵션 수입니다 getopts.

pauljohn32가 주석에서 언급했듯이 엄밀히 말하면 다음 명령 줄 인수 OPTIND의 위치를 ​​제공합니다 .

GNU Bash 참조 매뉴얼에서 :

getopts optstring 이름 [args]

getopts쉘 스크립트에서 위치 매개 변수를 구문 분석하는 데 사용됩니다. optstring인식 할 옵션 문자를 포함합니다. 문자 뒤에 콜론이 오는 경우 옵션에는 인수가 있어야하며 공백으로 구분해야합니다. 콜론 ( ':')과 물음표 ( '?')는 옵션 문자로 사용할 수 없습니다. 호출 될 때마다 getopts다음 옵션을 쉘 변수 이름에 배치하고 name존재하지 않는 경우 초기화 하고 변수로 처리 할 다음 인수의 색인을 배치합니다 OPTIND. OPTIND쉘 또는 쉘 스크립트가 호출 될 때마다 1로 초기화됩니다. 옵션에 인수가 필요한 경우, getopts는 해당 인수를 변수에 배치합니다 OPTARG. 쉘이 재설정되지 않습니다OPTIND 자동; getopts새로운 매개 변수 세트를 사용하려면 동일한 호출에서 여러 호출 사이에서 수동으로 재설정해야합니다 .

옵션 끝이 발견되면 getopts리턴 값이 0보다 큰 상태로 종료합니다. OPTIND는 옵션이 아닌 첫 번째 인수의 색인으로 설정되고 이름은 '?'로 설정됩니다.

getopts일반적으로 위치 매개 변수를 구문 분석하지만에 더 많은 인수가 제공 args되면 getopts대신 구문 분석합니다.

shift n
은 위치 매개 변수 목록에서 n 개의 문자열을 제거 합니다. 따라서 매개 변수 목록에서 shift $((OPTIND-1))구문 분석 된 모든 옵션을 제거 getopts하므로 해당 시점 이후 $1에 스크립트에 전달 된 첫 번째 비 옵션 인수를 참조합니다.

최신 정보

코멘트에서 mikeserv가 언급했듯이 shift $((OPTIND-1))안전하지 않을 수 있습니다. 원치 않는 단어 분리 등을 방지하려면 모든 매개 변수 확장을 큰 따옴표로 묶어야합니다. 명령의 안전한 형태는

shift "$((OPTIND-1))"


나머지 위치 인수 전에 옵션이 모두 발생하는 경우에만 올바르게 작동하는 것 같습니다. 옳은?
Steve Jorgensen

@SteveJorgensen : 예, 맞습니다. 옵션 아닌 인수 뒤에 옵션 넣는 OTOH 는 sh / bash 규칙에 위배됩니다. 일반적으로 대시로 시작하지 않는 첫 번째 인수는 옵션의 끝을 나타내며 대시로 시작하는 후속 인수는 옵션으로 간주되지 않습니다. 모든 프로그램이이 규칙을 준수하는 것은 아니지만 그렇게하면 인생이 훨씬 간단 해집니다. :)
PM 2Ring

@SteveJorgensen : (계속)이 주제는 왜 일부 유틸리티가 옵션 전에 피연산자를 구문 분석합니까? 에서 간략하게 설명합니다 . . Celada의 대답에 질 '댓글이 언급으로 (같은 일부 프로그램은 find) 수도 보면 그들이 비 선택 후 옵션을 허용처럼,하지만 그들은하지 : 그들은 대시로 시작 피연산자가 있습니다.
PM 2Ring

그 정보 (& 편집) @mosvy 주셔서 감사합니다. 매우 드문 IFS일이지만 미안보다 안전합니다. ;)
PM 2Ring

경우 @roaima IFS=0123456789, shift $((OPTIND-1))(따옴표없이)는로 바뀝니다 shift ""되는이 자동으로 (무시한다 ksh) 또는 (에서 오류를 생성 bash하고 dash).
mosvy

8

$((...))그냥 물건을 계산합니다. 귀하의 경우 $optint1 의 가치를 빼고 뺍니다.

shift위치 매개 변수를 제거합니다. 귀하의 경우 optint-1매개 변수가 제거 됩니다.

자세한 내용을 살펴 가지고 help getopts, help shift, 봐 man bash"산술 확장"에 대한, 그리고 특히 구글 getopts.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.