다음과 같은 스크립트를 얻으려고 합니다.
-q
옵션을 사용하여 변수 설정- 옵션에 대한 도움말 표시
-h
및 - 다른 옵션은 실패
-*
하지만 위치 인수는 허용됩니다.
이것은 getopts
내가 사용하는 스니펫입니다.
while getopts qh opt; do
case "${opt}" in
q)
quiet="true"
;;
h)
usage
exit 1
;;
\?)
echo "unrecognized option -- ${OPTARG}"
exit 1
;;
esac
shift
done
echo "unparsed: $*"
이것은 매우 간단한 것 같습니다. 그러나 단일 매개변수를 제공하거나 a.sh -q
예상 a.sh -h
되는 작업을 수행하는 경우에만 작동합니다.
그러나 두 개의 인수를 제공하거나 $2에 인식할 수 없는 인수를 제공하면 아무 작업도 수행되지 않습니다.
$ ./a.sh -b
unrecognized option -- b
$ ./a.sh -q -b
unparsed: -b
$ ./a.sh -h -k
this is my help message
unparsed: -k
왜 두 번째 매개변수($2)가 getopts 루프에서 처리되지 않는지 아시나요?
답변1
명령이 shift
잘못되었습니다. 그것은해야한다외부원형 while
. 노력하다:
while getopts :qh opt; do
case "${opt}" in
q)
quiet="true"
;;
h)
usage
exit 1
;;
\?)
echo "unrecognized option -- ${OPTARG}"
exit 1
;;
esac
done
shift $((OPTIND - 1))
echo "unparsed: $*"
예
코드 시작 부분에 다음 줄을 추가하면:
usage() { echo "this is my help message"; }
그런 다음 다음 테스트를 수행할 수 있습니다.
$ ./a.sh -q -foo
unrecognized option -- f
$ ./a.sh -q -h
this is my help message