getopts 간이 튜 토리 얼 (Small getopts tutorial) 번역문
명령 행 인 자 를 전문 적 으로 분석 하고 싶 을 때 getopts 는 선택 할 도구 입 니 다.이전 버 전의 형제 명령 getopt 와 달리 getopts 는 셸 내 장 된 명령 입 니 다.고급
getopts 는 GNU 스타일 의 긴 옵션 (-- my option) 이나 XF 86 스타일 의 긴 옵션 (- my option) 을 해석 할 수 없습니다!
소개 하 다.
술어
우리 가 여기 서 토론 하 는 일 을 먼저 알 아야 하기 때문에 범례 를 살 펴 보 자. 다음 명령 을 살 펴 보 자.
mybackup -x -f /etc/mybackup.conf -r ./foo.txt ./bar.txt
이 모든 것 을 위치 매개 변수 라 고 하지만 논리 그룹 으로 나 눌 수 있 습 니 다.
mybackup -xrf /etc/mybackup.conf ./foo.txt ./bar.txt
자신의 코드 를 사용 하여 해석 하 는 것 은 매우 어렵다.getopts 는 모든 일반적인 옵션 형식 을 알 아 볼 수 있 습 니 다.
옵션 표 지 는 대소 문자 도 있 고 숫자 도 있 습 니 다.심지어 다른 식별 가능 한 문자 도 있 지만 이렇게 하 는 것 을 추천 하지 않 습 니 다 (가용성 이 떨 어 지고 특수 문자 에 문제 가 생 길 수 있 습 니 다).
의 원리
보통 getopts 를 여러 번 호출 해 야 합 니 다.매번 '다음' 위치 매개 변수 (가능 한 추가 매개 변수) 를 사용 합 니 다. 분석 에 성공 하면 결 과 를 되 돌려 줍 니 다.getopts 는 위치 매개 변수 설정 을 바 꾸 지 않 습 니 다. shift 에서 인 자 를 떨 어 뜨리 려 면 수 동 으로 처리 해 야 합 니 다.
shift $((OPTIND-1))
# now do something with $@
getopts 는 분석 할 인자 가 남 아 있 지 않 을 때 종료 상태 FALSE 로 되 돌아 가기 때문에 while 순환 에서 쉽게 사용 할 수 있 습 니 다.
while getopts ...; do
...
done
getopts 는 옵션 과 가능 한 인 자 를 분석 합 니 다.첫 번 째 옵션 이 아 닌 인 자 를 만 났 을 때 해석 을 중단 합 니 다. (연결 문자 (-) 로 시작 하지 않 는 문자열 입 니 다. 이것 은 앞의 모든 옵션 의 인자 가 아 닙 니 다.)이 의 미 는 옵션 이 종료 되 었 기 때문에 -- (이중 연결 문자) 를 볼 때 해석 을 중단 합 니 다.
유용 한 변수
변량
묘사 하 다.
OPTIND
다음 분석 할 인자 의 지침 을 저장 합 니 다.이것 이 바로 getopts 가 자신의 상태 와 반전 요 구 를 어떻게 기억 하 는 지 입 니 다.getopts 처리 후 shift 에서 위치 변 수 를 떨 어 뜨리 는 데 도 사용 할 수 있 습 니 다.OPTIND 는 처음에 1 이 었 습 니 다. getopts 를 다시 사용 하여 모든 인 자 를 분석 하려 면 1 로 다시 설정 해 야 합 니 다.
OPTARG
이 변 수 는 getopts 에서 발 견 된 옵션 의 인자 로 설정 되 어 있 습 니 다.알 수 없 는 옵션 표시 도 포함 되 어 있 습 니 다.
OPTERR
(선택 값 0 또는 1) Bash 가 getopts 에 내 장 된 오류 정 보 를 표시 해 야 하 는 지 여부 입 니 다.이 값 은 셸 이 시 작 될 때마다 1 로 초기 화 됩 니 다. - 그 러 니 귀 찮 은 정 보 를 보고 싶 지 않 으 면 0 으로 설정 하 세 요!
getopts 역시 이 변 수 를 오류 보고 에 사용 합 니 다 (they 're set to value - combinations which arent possible in normal operation).\# 괄호 안에 있 는 것 은 번역 되 지 않 고 예약 합 니 다.
네가 하고 싶 은 것 을 가리키다
getopts 의 기본 문법 은:
getopts OPTSTRING VARNAME [ARGS...]
설명:
OPTSTRING
getopts 가 원 하 는 옵션 과 원 하 는 인자 가 어디 에 있 는 지 알려 줍 니 다 (아래 참조)
VARNAME
getopts 에 옵션 보고서 에 사용 할 셸 변 수 를 알려 줍 니 다.
ARG
getopts 에 위치 매개 변수 가 아 닌 추가 단어 로 해석 하 라 고 알려 주세요.
option-string
option - string 은 getopts 가 원 하 는 옵션 을 알려 주 고 어떤 옵션 에 인자 가 있어 야 하 는 지 알려 줍 니 다.문법 은 매우 간단 합 니 다 - 모든 알파벳 은 옵션 이름 자체 입 니 다. 아래 의 범례 는 getopts 에 게 - f, - A 와 - x 를 찾 는 것 을 알려 줍 니 다.
getopts fAx VARNAME
getopts 가 어떤 옵션 에 인 자 를 기대 하 게 하려 면 이 옵션 표시 뒤에 만: (콜론) 을 설치 하 십시오.만약 에 - A 가 하나의 인자 (예 를 들 어 - A SOMETHING) 를 원한 다 면:
getopts fA:x VARNAME
option - string 의 첫 번 째 자모 가: (사칭) 이 라면 보통 터 무 니 없 는 것 입 니 다. 그 전에 옵션 이 없 기 때문에 getopts 는 '침묵 오류 보고' 모드 로 전환 합 니 다.제품 스 크 립 트 에서 이것 은 보통 당신 이 원 하 는 결과 입 니 다.
사용자 정의 매개 변수 분석
getopts 도 구 는 현재 셸 이나 함수 의 위치 매개 변 수 를 기본 으로 해석 합 니 다 ('$@' 을 의미 합 니 다).
매개 변 수 를 분석 할 수 있 습 니 다. 부가 매개 변 수 는 VARNAME 매개 변수 다음 에 제 시 될 때 getopts 는 이 위치 변 수 를 분석 하려 고 하지 않 습 니 다.
이런 방식 으로 당신 이 좋아 하 는 방식 으로 모든 옵션 을 해석 할 수 있 습 니 다. 여 기 는 배열 의 범례 입 니 다.
while getopts :f:h opt "${MY_OWN_SET[@]}"; do
...
done
이 추가 매개 변 수 를 가지 고 getopts 를 호출 하지 않 는 방식 은 명시 적 사용 "$@"호출:
getopts ... "$@"
오류 보고
오류 보고 에 대해 getops 는 두 가지 모드 에서 실행 할 수 있 습 니 다.
상세 모드
invalid option
VARNAME is set to ? (quersion-mark) and OPTARG is unset
required argument not found
VARNAME is set to ? (quersion-mark), OPTARG is unset and an error message is printed
조용 모드
invalid option
VARNAME is set to ? (question-mark) and OPTARG is set to the (invalid) option character
required argument not found
VARNAME is set to : (colon) and OPTARG contains the option-character in question
시작 하 다
첫 번 째 예
몇 가지 문 제 를 충분히 설명 할 수 있다!
아주 간단 한 인 스 턴 스 를 먼저 보 겠 습 니 다. 원 하 는 옵션 (- a) 만 있 고 인자 가 없습니다. 마찬가지 로 저 희 는 테이프: (콜론) option string 을 사용 하여 자세 한 오 류 를 사용 하지 않 습 니 다.
#!/bin/bash
while getopts ":a" opt; do
case $opt in
a)
echo "-a was triggered!" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
나 는 이 내용 을 파일 go test. sh 에 넣 었 는데, 바로 네가 다음 에 본 범례 중의 이름 이다.
테스트 를 해 보 겠 습 니 다.
매개 변수 호출 없 음
$ ./go_test.sh
$
아무 일 도 일어나 지 않 았 습 니까? 맞습니다. getopts 는 합 법 적 이거 나 불법 적 인 옵션 (앞 에 짧 은 가로줄 이 있 는 알파벳) 을 보지 못 했 기 때문에 촉발 되 지 않 습 니 다.
옵션 이 아 닌 인자 로 호출
$ ./go_test.sh /etc/passwd
$
아니면 - 아무 일 도 일어나 지 않 았 습 니 다. 매우 유사 한 용례: getopts 는 합 법 적 이거 나 불법 적 인 옵션 (앞 에 짧 은 가로줄 의 자모 가 있 음) 을 보지 못 했 기 때문에 촉발 되 지 않 습 니 다.
당신 에 게 전 달 된 스 크 립 트 의 인 자 는 당연히 $1 - ${N} 로 가 져 올 수 있 습 니 다.
옵션 매개 변수 로 호출
이제 getopts: 옵션 을 터치 합 니 다.
우선, 불법 으로:
$ ./go_test.sh -b
Invalid option: -b
$
예상대로 getopts 는 이 옵션 을 허용 하지 않 습 니 다. 위 에서 말 한 것 처럼: It placed? into $opt and the invalid option character (b) into $OPTARG. 우리 의 사례 는 이 점 을 검증 합 니 다.
지금 합 법 적 인 (- a):
$ ./go_test.sh -a
-a was triggered!
$
이 탐측 결 과 는 완벽 하 게 작 동 하 는 것 을 보 았 습 니 다. 우리 의 용례 a 옵션 은 변수 $opt 에 놓 여 있 습 니 다.
물론 호출 할 때 유효 하고 잘못된 옵션 을 조합 할 수 있 습 니 다.
$ ./go_test.sh -a -x -b -c
-a was triggered!
Invalid option: -x
Invalid option: -b
Invalid option: -c
$
마지막 으로 자 연 스 럽 게 우리 의 옵션 을 여러 번 제시 할 수 있다.
$ ./go_test.sh -a -a -a -a
-a was triggered!
-a was triggered!
-a was triggered!
-a was triggered!
$
마지막 예 는 우리 로 하여 금 몇 가 지 를 고려 해 야 하 게 한다.
위의 예 를 확장 합 시다. 조금 만:
#!/bin/bash
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
마지막 범례 와 같은 테스트 를 계속 합 시다.
매개 변수 호출 없 음
$ ./go_test.sh
$
위 와 같이 아무 일 도 일어나 지 않 았 다. 촉발 되 지 않 았 다.
옵션 이 아 닌 인자 로 호출
$ ./go_test.sh /etc/passwd
$
매우 유사 한 상황: 촉발 되 지 않 았 습 니 다.
매개 변수 옵션 호출
불법 옵션:
$ ./go_test.sh -b
Invalid option: -b
$
기 대 했 던 것 처럼 getopts 는 이 옵션 을 허용 하지 않 습 니 다. 프로그램 알고리즘 과 일치 합 니 다.
합 법 적 인 옵션 이지 만 강제 적 으로 요구 되 는 인자 가 없습니다:
$ ./go_test.sh -a
Option -a requires an argument.
$
OK 를 선택 하 였 으 나 인 자 를 잃 어 버 렸 습 니 다.
이 인 자 를 제공 합 니 다:
$ ./go_test.sh -a /etc/passwd
-a was triggered, Parameter: /etc/passwd
$
참고 자료
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
성공할 때까지 명령 실행최근에 유용한 간단한 BASH 패턴: Run command every time it fails until it doesn't fail. 예시 작은 배치로 수십만 개의 레코드를 내보내야 하는 장기 실행 작업이 있었습니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.