getopts
저는 이라는 변수를 사용하는 관용적인 방법을 사용하고 있습니다 arg
. 아래와 같이 옵션 이름을 캡처할 수 있습니다. 메시지를 내보낼 수 있도록 getopts가 "--"에 도달하는 순간을 감지할 수 있습니까?
while getopts "$shortopts" arg; do
echo "--> arg: $arg"
case $arg in
("V")
printf '%s\n' "Version"
return
;;
("u")
printf '%s\n' "Usage"
return
;;
("h")
printf '%s\n' "Help"
return
;;
esac
done
답변1
메시지를 내보낼 수 있도록 getopts가 "--"에 도달하는 순간을 감지할 수 있습니까?
이렇게 할 필요는 없습니다.
getopts
표준 옵션 처리를 구현합니다. 즉, 옵션이 아닌 인수가 보이거나 인수가 보이면 --
옵션 목록을 명시적으로 종료하는 options 검색을 중지합니다. (첫 번째 점은 전체 명령줄에서 옵션을 찾는 GNU Custom과 다릅니다.)
프로그램은 Meet 에 신경 쓸 필요가 없습니다 --
.
즉, getopts
위치 매개변수 목록이 폐기되지 않으므로 그 안의 마지막 매개변수가 인지 알 수 있다 --
.
#!/bin/bash
while getopts a:bc opt; do
echo "option $opt arg $OPTARG"
done
last=
if [ "$OPTIND" -ge 2 ]; then
shift "$((OPTIND - 2))"
last=$1
shift 1
else
shift "$((OPTIND - 1))"
fi
if [ "$last" = "--" ]; then
echo "options were terminated by a double-dash (or last arg was an option-argument '--')"
fi
echo "remaining args: $*"
예를 들어
$ bash opts.sh -a blah -- -b foo
option a arg blah
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: -b foo
그러나 마지막 인수만 확인하므로 옵션에 대한 --
구분 기호 또는 옵션 인수가 될 수 있습니다. --
예를 들어, 이것은 거짓양성입니다 --
. 여기에는 구분 기호가 없습니다.
$ bash opts.sh -a -- foo
option a arg --
options were terminated by a double-dash (or last arg was an option-argument '--')
remaining args: foo
물론 자신만의 옵션 처리를 구현할 수도 있지만 그렇게 하면 셸이 하위 문자열 처리를 어렵게 만들기 때문에 약간 짜증납니다. ( options 인수를 사용하는지 여부 -abc
에 따라 이를 세 가지 다른 옵션 또는 하나 또는 두 개로 인식해야 합니다 .)-a
-b
어쨌든 일반적으로 필요한 것보다 훨씬 더 복잡한 작업을 수행하지 않는 한 고려할 이유가 없습니다 . 더 복잡한 작업을 수행하더라도 외부에서 수행하는 것을 고려할 수 있습니다(다른 구분 --
기호 사용). getopts
in 표현식이 주어지거나 GNU Parallel이 분리된 인수 목록을 가져오는 방법 등이 있습니다.find
:::
::::
답변2
루프가 끝나면 다음을 getopts
수행하는 데 익숙해집니다.
shift "$((OPTIND - 1))"
나머지 매개변수는 나머지 매개변수가 됩니다. ( man getopts
1POSIX의 예제 1 섹션을 참조하세요).
요점은,설명에서:
다음 상황 중 하나는 옵션의 끝을 식별해야 합니다. 첫 번째 "--" 인수가 옵션 인수가 아니거나, 옵션 인수가 아니고 "-"로 시작하지 않는 인수가 발견되었거나, 오류가 발생했습니다. .
패턴이 있다고 가정합니다 ab:
. 다음은 4. 데모입니다 --
.
-a x y z
-a
배너. 나머지:x y z
-a -b foo x y z
-a
플래그 +-b
값 =foo
.rest:x y z
-b foo -a -b bar x y z
-a
플래그 +-b
값 =foo
sum.restbar
:x y z
- 두 값이 모두
-b
전달됩니다. 스크립트가 처리하는 방법에 따라 다릅니다.
-a -b foo -- -a -b x y z
-a
플래그 +-b
값 =foo
.rest:-a -b x y z
-a -b foo -x y z
- 잘못되었거나 알 수 없는 옵션
-x
- 잘못되었거나 알 수 없는 옵션
-b foo bar -x y z
-b
값 =foo
.rest:bar -x y z
-b -- -a bar -x y z
-a
플래그 +-b
값 =--
.rest:bar -x y z
7의 경우 옵션에 대한 인수로 , --
또는 를 포함한 모든 문자열을 가질 수 있습니다 ""
.
$((...))
1 그러나 예제에서 ; 주위의 따옴표가 어떻게 누락되었는지 확인하세요. POSIX 예제에서는 기본값이 포함되어 있다고 가정하는데 $IFS
, 이는 어떤 상황에서도 사용할 수 없기 때문에 불행한 일입니다.
답변3
getopts
루프 조건을 0으로 초기화되는 변수(이 경우 1)로 설정합니다 "--")
. 예를 들어
stop=0
...
while [[ 0 -eq $stop ]] ; do
# getopts call ...
...
"--") stop=1;;r
esac
done