ShellScript getopt
getopts
$ script.sh a b c d
$0 $1 $2 $3 $4
-------------------
$@
getopts
명령어는 옵션과 해당 인자를 파싱하는데 사용되는 POSIX 쉘 빌트인 명령어입니다.
getopts <optString> option [parameters="$@"]
echo $option
echo $OPTARG
echo $OPTIND # 다음 인자의 인덱스
getopt
getopts
의 단점은
- 짧은 옵션만 파싱 가능합니다
- 옵션이 아닌 인자 다음에 오는 옵션을 파싱할 수 없습니다
getopt
명령어는 옵션과 옵션이 아닌 인자를 재정렬하고, 짧은 옵션과 긴 옵션을 모두 파싱할 수 있습니다.
getopt -o <shortOptString> -l <longOptString> -- <parameters>
shortOptString
<option1>[:][<option2>[:]...]
-a
, -b
를 파싱하고 싶으면, shortOptString
을 ab
를 설정하면 됩니다. 만약 -a
옵션이 값을 받아야 하면 :
을 사용하여 a:b
로 설정하면 됩니다. getopt
는 -
이후에 하나의 문자열만 인식하므로 -a a_arg
와 -aa_arg
는 같은 표현으로 간주합니다.
Example
set -- -aa_arg -b asdf \
&& getopt -o a:b -- "$@"
-a 'a_arg' -b -- 'asdf'
longOptString
<option1>[:][,<option2>[:],...]
--foo
--bar
를 파싱하고 싶으면, longOptString
에 foo,bar
를 설정하면 됩니다. 만약 --foo
옵션이 값을 받아야 하면, :
을 사용하여 foo:,bar
로 설정하면 됩니다. getopt
는 --foo=arg
와 --foo arg
를 같은 표현으로 간주합니다.
Example
set -- --foo arg --bar \
&& getopt -o "" -l foo:,bar -- "$@"
Example script
#!/bin/sh
set -e
RED=$(tput setaf 1)
BOLD=$(tput bold)
DEFAULT=$(tput sgr0)
COMMAND=$(basename "$0")
helpMsg() {
cat <<END
사용법:
$COMMAND [옵션] [인자]
옵션:
-a, --aaa
-b, --bbb <값>
-c, --ccc
예시:
END
}
if [ $# -eq 0 ] || ! options=$(getopt -o ab:c -l aaa,bbb:,ccc,help \
-n $(basename "$0") -- "$@"); then
printf "%s\n" "${RED}${BOLD}${helpMsg}${DEFAULT}" >&2
exit 1
fi
eval set -- "$options"
while true; do
case "$1" in
-a | --aaa)
echo "$1"
shift
;;
-b | --bbb)
echo "$1" "$2"
shift 2
;;
-c | --ccc)
echo "$1"
shift
;;
--help)
helpMsg
exit 0
;;
--)
shift
break
;;
esac
done
echo "$@"