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

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

저는 Linux 매니아는 아니지만 프로젝트를 위해 읽어야 하는 일부 스크립트가 막혔습니다. 그렇다면 이 명령이 수행하는 작업을 도와줄 수 있는 사람이 있나요?

shift $(($optind - 1))

답변1

shift $((OPTIND-1))( OPTIND대문자 사용에 주의하세요)는 일반적으로 getopts while루프 바로 다음에 나타납니다. $OPTIND발견된 옵션의 수입니다 getopts.

pauljohn32가 의견에서 언급했듯이 엄밀히 OPTIND말하면다음명령줄 매개변수.

GNU에서배쉬 참조 매뉴얼:

getopts optstring 이름[args]

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

옵션의 끝에 도달하면 getopts종료하고 0보다 큰 값을 반환합니다. OPTIND이름이 "?"로 설정된 첫 번째 비옵션 매개변수의 인덱스로 설정됩니다.

getoptsargs위치 인수는 일반적으로 구문 분석되지만 에 더 많은 인수가 제공되면 getopts해당 인수가 구문 분석됩니다.

shift N
삭제N위치 인수 목록의 문자열입니다. 따라서 해결된 모든 옵션은 인수 목록에서 제거되므로 shift $((OPTIND-1))이후에는 스크립트의 옵션이 아닌 첫 번째 인수에 참조가 전달됩니다.getopts$1

고쳐 쓰다

의견에서 mikeserv가 언급했듯이 shift $((OPTIND-1))아마도 안전하지 않을 것입니다. 불필요한 단어분할 등을 방지하기 위해모두매개변수 확장은 큰따옴표로 묶어야 합니다. 따라서 이 명령의 안전한 형식은 다음과 같습니다.

shift "$((OPTIND-1))"

답변2

$((...))그냥 계산하는 것뿐입니다. 귀하의 예에서는 값을 가져와 $optint1을 뺍니다.

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

help getoptshelp shift자세한 내용은 " 산술 확장"을 확인 man bash하고 특히 Google에서 검색하세요.getopts.

관련 정보