인터넷 검색을 통해 얻은 지식을 바탕으로 엮은 스크립트가 있습니다.
#!/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;;