OPTIND
나는 그것이 어떻게 작동하는지 이해하고 싶습니다 getopts
. 처음 몇 개의 위치 매개변수를 건너뛰려면 어떻게 설정해야 합니까 OPTIND
?
그리고 OPTIND는 자동으로 재설정되지 않기 때문에 getopts에 대한 여러 호출 간에 수동으로 정확하게 재설정하는 방법을 알아야 합니다.
첫 번째 호출에서 보고된 오류를 받았기 때문입니다.
gopi -z
/usr/local/bin/bash: option requires an argument -- z
그러나 두 번째로 호출했을 때 오류가 보고되지 않았습니다.
gopi -z
이것은 기능입니다
gopi ()
{
local parg=""
while (( $# > 0 )); do
parg="$1"
case $parg in
("-s"|"--silent") opstring=":n:z:" ;;
(*) break ;;
esac # case ends here
shift 1
done
while getopts "$opstring" opname; do
case ${opname} in
("n") dothis ;;
("z") dothat ;;
(?)
## Invalid Option Found
echo "Invalid option: -$OPTARG" 1>&2
exit 1
;;
(:)
## Required option argument not found
echo "Option -$OPTARG requires an argument" 1>&2
exit 1
;;
esac
done
}
답변1
그리고 OPTIND는 자동으로 재설정되지 않기 때문에 getopts에 대한 여러 호출 간에 수동으로 정확하게 재설정하는 방법을 알아야 합니다.
Bash의 매뉴얼 페이지에는 다음과 같이 나와 있습니다( getopts
설명 아래).
OPTIND
쉘 또는 쉘 스크립트가 호출될 때마다 1로 초기화됩니다.
이는 재설정이 1
작동해야 함을 의미합니다.이는 POSIX 설명에서 더 명확하게 설명됩니다.getopts
:
애플리케이션이 설정된 경우선택값 1의 경우 새 매개변수 세트(현재 위치 매개변수 또는 새 인수 값)를 사용할 수 있습니다. 단일 쉘 실행 환경에서 모든 호출에서 동일하지 않은 인수(위치 인수 또는 인수 피연산자)를 사용하여 getopts를 여러 번 호출하려는 기타 모든 시도 또는 다음을 사용하여 getopts를 여러 번 호출하려는 시도선택값을 1이 아닌 값으로 수정하면 지정되지 않은 결과가 생성됩니다.
여기서 두 번째 호출에서는 foo
첫 번째 인수가 누락되었지만 -a
마지막 호출에서는 foo
두 인수가 모두 다시 표시됩니다.
foo() {
echo --
while getopts abc opt; do
echo $opt
done
}
foo -abc
foo -a -b
OPTIND=1
foo -a -b
OPTIND=1
물론, 호출하기 전에 함수 시작 부분에 설정하는 것이 더 합리적입니다 getopts
.
연구된 값은 별로 유용하지 않습니다 OPTIND
. 이는 개별 명령줄 인수 내의 위치에 대한 정보를 포함하지 않기 때문에 완전한 진실이 아닙니다. 예를 들어, 위의 첫 번째 호출에서 매개변수를 사용하여 -abc
루프 내부에 1, 1, 2 값을 취하면 현재 문자 위치가 표시되지 않습니다. (Bash와 ksh에서는 함수 입력 시 Zsh가 재설정되는 것처럼 보이는 반면, yash는 값의 인수 내 위치를 인코딩합니다.)foo
OPTIND
OPTIND
OPTIND