여러 문자 옵션을 지원해야 하는 사용 사례가 있습니다. 현재 저는 getopts의 단일 문자 옵션을 사용하고 있습니다. 다중 문자 옵션이 바람직합니다. 이를 수행하는 가장 좋은 방법은 무엇입니까? 이 사용 사례에 대해 수동 파서를 구현하는 기사를 본 적이 있지만 이것이 성능에 최적입니까?
-ab와 같은 것이 -a -b 대신 -ab로 처리되기를 원합니다. 이것도 좋은 코딩 습관인가요?
이는 옵션에 대한 완전한 정보를 제공하지 않는 단일 문자 옵션보다는 옵션을 더 의미있게 만들기 위한 것입니다.
중요: 또한 이러한 다중 문자 옵션이 있는 optargs도 필요합니다. 예 -ab "sdfd" .
이것은 코드입니다
while getopts ":s:p:q:j:o" opt; do
case ${opt} in
s)
only_save=TRUE
new_tok=$OPTARG
;;
p)
only_upload_enum_json=TRUE
enum="job_status"
new_tok=$OPTARG
;;
q)
only_upload_enum_json=TRUE
enum="lifecycle_state"
new_tok=$OPTARG
;;
j)
only_download_enum_json=TRUE
enum=$OPTARG
;;
o)
only_download=TRUE
;;
\?)
echo " -s <token>"
echo " -p <token>"
echo " -q <token>"
echo " -j <enum_name>"
echo " -o <no value needed>"
exit;
;;
esac
done
여기서 job_status에 대해서는 -p 대신 -js를 사용하는 것이 좀 더 의미가 있다. lifecycle_state도 마찬가지입니다.
답변1
개인적으로 저는 getopt
대신 아래의 shell-script-template이라는 함수를 사용합니다.getopts
option_handling
옵션을 통해 매개변수를 전달하려면 다음을 수행할 수 있습니다.
옵션이 -z 'something'이라고 가정하면...
[...]
--options hVvz:
[...]
-z)args="$2"; shift2;;
살펴보고 싶으시다면 /usr/share/doc/util-linux/examples/getopt-parse.bash
사전 설치되어 있어야 합니다.
템플릿은 다음과 같습니다.
#!/usr/bin/env -S bash -
#===============================================================================
#
# FILE: <<filename here>>
#
# USAGE:
#
# DESCRIPTION:
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR:
# ORGANIZATION:
# CREATED:
# LICENSE: BSD-3-CLAUSE
# REVISION: ---
#===============================================================================
#=== Init ======================================================================
set -o nounset # exit on unset variables.
set -o errexit # exit on any error.
set -o errtrace # any trap on ERR is inherited
#set -o xtrace # show expanded command before execution.
unalias -a # avoid rm being aliased to rm -rf and similar issues
LANG=C # avoid locale issues
VERBOSE= # Don't be verbose, unless given '-v'-option
ScriptVersion="1.0"
trap "cleanup" EXIT SIGTERM
#=== Functions =================================================================
usage (){
echo "
Usage : ${0##/*/} [options] [--]
Options:
-h|--help Display this message
-V|--version Display script version
-v|--verbose Print informational text
"
exit 0
} # ---------- end of function usage ----------
option_handling () {
# see /usr/share/doc/util-linux/examples/getopt-parse.bash
OPTS=$(getopt --name "$0" \
--options hVv \
--longoptions help,version,verbose \
--shell bash \
-- "$@") \
|| (echo; echo "See above and try \"$0 --help\""; echo ; exit 1)
eval set -- "$OPTS"
unset OPTS
while true ; do
case "$1" in
-h|--help)
usage
;;
-V|--version)
echo "$0 -- Version $ScriptVersion"; exit 0
;;
-v|--verbose)
VERBOSE=true
shift
;;
--)
shift ; break
;;
*)
echo "I don't know what to do with \"$1\". Try $0 --help"
exit 1
;;
esac
done
} # ---------- end of function option_handling ----------
cleanup () { # Will be called by the trap above, no need to call it manually.
:
} # ---------- end of function cleanup ----------
# see https://github.com/markgraf/flatten.sh about this
. ~/scripting/library.bash/lazy.lib
#=== Main ======================================================================
main () {
option_handling "$@"
} # ---------- end of function main ----------
main "$@"
#=== End =======================================================================