중복 가능성:
쉘 스크립트에서 스위치를 처리하는 방법은 무엇입니까?
가장 일반적인 쉘 명령을 사용하면 사용자는 임의의 순서로 옵션을 지정할 수 있습니다. $1
반면에 bash에서 일반적으로 사용되는 위치 매개변수(저는 모든 스크립트를 Bash로 작성하는 경향이 있지만 이 질문이 실제로 Bash에만 해당되는 것은 아니라고 생각합니다)와 같이 스크립트는 순서에 따라 다릅니다.
이제 난 알아낼 수 있어일부선택적 인수를 제공할 때 bash 스크립트 사용자가 특정 순서를 따르도록 요구하지 않는 방법입니다. (확장자에 특정 옵션이 있는지 테스트하기 위해 정규식이나 전역 변수를 사용하려고 생각했습니다 $@
.) 그러나 그러한 옵션을 구현하는 특별히 표준적인 방법이 있는지 알고 싶습니다. 옵션의 공통 구문(예: -r
많은 쉘 명령)을 고려하면 분명히 있어야 한다고 생각합니다.
답변1
getopt
주어진 매개변수의 모든 순서를 지원 합니다 getopts
. 사용하기 쉽고 매개변수 구문 분석을 위한 표준 솔루션으로 보입니다.
자주 언급되는 두 가지 차이점은 다음과 같습니다.
getopt
긴 옵션을 지원합니다--help
.getopts
독립형 프로그램이 아닌 내장 Bash 쉘입니다.
광범위한 단순화예:
# Process parameters
params="$(getopt -o e:hv \
-l exclude:,help,verbose \
--name "$0" -- "$@")"
if [ $? -ne 0 ]
then
usage
fi
eval set -- "$params"
unset params
while true
do
case $1 in
-e|--exclude)
excludes+=("${2-}")
shift 2
;;
-h|--help)
usage
exit
;;
-v|--verbose)
verbose='--verbose'
shift
;;
--)
shift
if [ -z "${1:-}" ]
then
error "Missing targets." "$help_info" $EX_USAGE
fi
if [ -z "${2:-}" ]
then
error "Missing directory." "$help_info" $EX_USAGE
fi
targets=(${@:1:$(($#-1))})
source_dir="${@:$#}"
break
;;
*)
usage
;;
esac
done