getopts는 길고 짧은 옵션을 구문 분석하는 데 사용됩니다.

getopts는 길고 짧은 옵션을 구문 분석하는 데 사용됩니다.

짧은 옵션만 허용하는 스크립트가 이미 있고 동일한 스크립트를 확장하여 해당하는 긴 옵션을 전달하려고 합니다. 기존 코드는 다음과 같습니다.

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+cc+c

참고: bosh인접한 짧은 옵션 없이 긴 옵션을 지원하는 방법은 한 가지뿐입니다. bosh매뉴얼 페이지를 참조하십시오 .

저는 schilytools의 저자입니다.

관련 정보