다음 함수가 있는데 이를 사용하여 선택적 값으로 옵션을 설정하는 방법을 알고 싶습니다 getopt
.
-w
기본값을 사용하고 싶습니다 .
region -w -- "Text"
여기에는 -w 1
선택적 숫자 값이 필요합니다.
region -w 1 -- "Text"
여기서 기능
region ()
{
# Process command line options
shortopts="hw::"
longopts="help,version,warning:"
opts=$(getopt -o "$shortopts" -l "$longopts" \
-n "$(basename $0)" -- "$@")
if [ $? -eq 0 ]; then
eval "set -- ${opts}"
while [ $# -gt 0 ]; do
case "$1" in
-h|-\?|--help)
printf "%s\n" "Todo."
shift
break
;;
-w|--warning)
case "$2" in
"1") local -r warn="first"; shift 2 ;;
*) local -r warn="all"; shift 2 ;;
esac
local -r f=1
;;
--)
local -r f=1
shift
break
;;
esac
done
else
shorthelp=1 # getopt returned (and reported) an error.
fi
}
답변1
아마도 이 답변이 마음에 들지 않을 것입니다. 선택적으로 인수를 취하는 옵션에 인수를 제공하려면 공백을 사용할 수 없습니다.
$ getopt -o 'w::' -- -w -- arg
-w '' -- 'arg'
$ getopt -o 'w::' -- -w 1 -- arg
-w '' -- '1' 'arg'
$ getopt -o 'w::' -- -w1 -- arg
-w '1' -- 'arg'
마찬가지로 옵션 긴 인수의 경우 다음을 사용해야 합니다.=
$ getopt -o '' -l 'warning::' -- --warning -- arg
--warning '' -- 'arg'
$ getopt -o '' -l 'warning::' -- --warning 1 -- arg
--warning '' -- '1' 'arg'
$ getopt -o '' -l 'warning::' -- --warning=1 -- arg
--warning '1' -- 'arg'
매뉴얼 페이지에서:
간단한 짧은 옵션은 "-" 뒤에 짧은 옵션 문자가 오는 것입니다. [...] 옵션에 선택적 인수가 있는 경우옵션 문자 바로 뒤에 써야 합니다.존재하는 경우.
긴 옵션은 일반적으로 '--'로 시작합니다. [...] 옵션에 선택적 인수가 있는 경우긴 옵션 이름 바로 뒤에 작성해야 하며 "="로 구분해야 합니다., 존재하는 경우("="를 추가하고 그 뒤에 아무것도 추가하지 않으면 매개변수가 없는 것처럼 해석됩니다. 이는 사소한 버그입니다. 버그를 참조하세요.)
코드 레이아웃에 대한 코드 검토 설명입니다. if-else-fi 구문에서는 짧은 분기를 먼저 배치하세요. 여기에 도착하면 상황이 어떤지 else
기억하기 위해 스캔해야 합니다 .if
또한 이를 통해 "어설션" 스타일로 작성하고 함수의 "주" 코드를 줄일 수 있습니다.
region ()
{
# Process command line options
shortopts="hw::"
longopts="help,version,warning:"
opts=$(getopt -o "$shortopts" -l "$longopts" \
-n "$(basename $0)" -- "$@")
if [ $? -ne 0 ]; then
shorthelp=1 # getopt returned (and reported) an error.
return
fi
eval "set -- $opts"
# ...
또는 종료 상태를 직접 확인하고 여전히 변수에 할당할 수 있습니다. (여기서 기본 이름 호출도 제거했습니다.)
if ! opts=$(getopt -o "$shortopts" -l "$longopts" -n "${0##*/}" -- "$@")
then
shorthelp=1 # getopt returned (and reported) an error.
return
fi
-w를 사용하여 level=1을 설정했습니다. 그렇지 않으면 -wNUM에 대해 level=NUM을 설정합니다.
local level=0
#...
case "$1" in
-w|--warning)
level=${2:-"1"}
;;
즉, ${var:-default}
매개변수 확장의 형태입니다.