짧은 옵션만 허용하는 스크립트가 이미 있고 동일한 스크립트를 확장하여 해당하는 긴 옵션을 전달하려고 합니다. 기존 코드는 다음과 같습니다.
while getopts :t:c: name; do
case name
t) first=$OPTARG;;
c) second=$OPTARG;;
*) echo 'Invalid option'; break;;
esac
done
SHIFT $((OPTIND-1))
이는 짧은 옵션에 적용되지만 긴 옵션 구문 분석을 허용하도록 동일한 코드를 확장하려면 어떻게 해야 합니까?
답변1
사용 가능한 옵션이 일관되지 않기 때문에 저는 직접 출시하는 경향이 있습니다.
SWITCH=false
VAL=default
while [ "$#" -gt 0 ] ; do
case "${1}" in
(-s|--switch) SWITCH=true ;;
(-v|--value) VAL="${2}" ; shift ;;
(-v?*) VAL="${1#-v}" ;;
(--value=?*) VAL="${1#--value=}" ;;
esac
shift
done
답변2
getopt()
이는 간단하지만 설명서는 Solaris 매뉴얼 페이지와 getopts
다음 설명서 에만 있습니다 bosh
.
http://schilytools.sourceforge.net/man/man1/bosh.1.html
2019년 12월 버전의 47페이지까지 아래로 스크롤하세요.
귀하의 예를 편집하겠습니다.
while getopts ":t:(test)c:(call)" name; do
case $name in
t) first=$OPTARG;;
c) second=$OPTARG;;
:) echo "Missing argument for -$OPTARG"; break;;
*) echo 'Invalid option'; break;;
esac
done
shift $((OPTIND-1))
괄호가 포함된 매개변수를 인용해야 할 수도 있습니다.
이는 -c
및 를 허용합니다 --call
.
이는 다음에만 적용됩니다.
- bosh, 모든 운영 체제에서 schilytools가 관리하는 POSIX 강화 Bourne Shell
- sh , Solaris 10의 기존 Bourne Shell
- 모든 운영 체제에서 ksh93
bosh
또한 UNIX 스타일의 긴 옵션 -long
이 .optstring
()
두 가지 모두 if 로 시작하는 옵션을 ksh93
지원합니다 . 이 경우 프로그램을 로 호출하면 대신 포함됩니다 .bosh
+
optstring
+
$name
+c
c
+c
참고: bosh
인접한 짧은 옵션 없이 긴 옵션을 지원하는 방법은 한 가지뿐입니다. bosh
매뉴얼 페이지를 참조하십시오 .
저는 schilytools의 저자입니다.