getopt를 사용하여 긴 스타일 명령줄 옵션을 bash 스크립트에 전달하는 방법은 무엇입니까?

getopt를 사용하여 긴 스타일 명령줄 옵션을 bash 스크립트에 전달하는 방법은 무엇입니까?

인터넷 검색을 통해 얻은 지식을 바탕으로 엮은 스크립트가 있습니다.

#!/usr/bin/env bash

usage() {
    declare -r script_name=$(basename "$0")
    echo """
Usage:
"${script_name}" [option] <name>

Option:
    -host <foo.com|bar.com|baz.com|...>
    -accountId <001123456789|002123456789|...>
"""
}

main() {
    if [[ $# -eq 0 ]]; then
        usage
        exit 1
    fi

OPTIONS=$(getopt -o '' -l help,host,accountId -- "$@")

eval set -- "$OPTIONS"

while true
do
    case $1 in
    -help) usage
           exit 0
           ;;
    -accountId) ACCOUNTID=$2; shift 2;;
    -host) HOST=$2 shift 2;;
    --) shift ; break ;;
    esac
done

echo host: $HOST, accountId: $ACCOUNTID

}

main "$@"

출력은 다음과 같습니다.

$ . test.sh -help
host: , accountId:

$ . test.sh -host foo.com -accountId 001123456789
host: , accountId:

내가 뭘 잘못했나요?

답변1

작은 버그가 있을 겁니다.;HOST=$2 이후

긴 옵션 앞에 대시를 사용하려면 추가할 수 있습니다.-ㅏgetopt 옵션.

추가적으로, 호스트와 계정ID에는 필수 옵션이 있으므로, 그 뒤에는 다음이 와야 합니다.:

OPTIONS=$( getopt -a -o '' -l help,host:,accountId: -- "$@" )

(camelCase는 최선의 선택이 아닙니다. accountId 대신 accountid를 사용하는 것은 어떨까요)

나는 일반적으로 장기 옵션과 단기 옵션을 모두 선호하므로 다음을 사용합니다.

OPTIONS=$( getopt -a -o 'h:a:' -l help,host:,accountId: -- "$@" )

그리고

-a|--accountId) ACCOUNTID=$2; shift 2;;
-h|--host) HOST=$2; shift 2;;

또한 getopt의 결과 코드를 확인해야 합니다. 옵션이 잘못된 경우 계속 진행하고 싶지 않습니다.

따라서 OPTIONS=$(... 줄 뒤에 다음을 추가합니다.

if [[ $? -ne 0 ]] ; then
    usage ; exit 1
fi

그런데, 사용량이 표시되면 언제든지 종료하고 싶을 수 있으므로1번출구사용이 끝나면 다음을 사용할 수 있습니다.

[[ $# -eq 0 ]] && usage
...
[[ $? -ne 0 ]] && usage
...
--help) usage;;

관련 정보