如何将getopt
orgetopts
与子命令和长选项一起使用,而不是与短选项一起使用?我知道如何使用 来实现短期和长期选项getopts
。到目前为止,我发现的解决方案是getopts
在子命令 switch-case 中使用,但选项很短,例如:
例如,我如何实现以下子命令及其长选项?:
$> ./myscript.sh help
show
show --all
set
set --restart
reset
reset --restart
help
答案1
在函数中手动解析它们,并使用"$@"
.调用后,任何剩余的非选项都位于$1
、$2
等中。请注意,在本例中,我使用关联数组来保存开关。如果您没有 bash 3 或更高版本,则可以使用全局变量。
子命令将是 args[0] 及其其余选项。
usage() {
echo "${0##*/} [options...] args ... "
}
version() {
echo "0.1"
}
parse_opt() {
while [[ -n "$1" ]]; do
case "$1" in
--) break ;;
## Your options here:
-m) opts[m]=1 ;;
-c|--center) opts[c]="$2" ; shift ;;
-x) opts[x]=1 ;;
## Common / typical options
-V) version; exit 0 ;;
--version)
version; exit 0 ;;
-?|--help)
usage ; exit 0 ;;
-*)
echo >&2 "$0: Error in usage."
usage
exit 1
;;
*) break ;;
esac
shift
done
args=("$@")
}
declare args
declare -A opts # assoc array
parse_opt "$@"
case "${args[0]}" in
sub1)
"${args[@]}" ;;
*)
echo >&2 "Unknown sub-command"
exit 1
esac