Bash 手册说
getopts optstring name [args]
当遇到选项末尾时,
getopts
退出并返回大于零的值。OPTIND
设置为第一个非选项参数的索引并name
设置为?
。
是不是意味着
getopts
只读取选项和选项参数,而不读取既不是选项也不是选项参数的参数?getopts
无法处理在命令行中在某些既不是选项也不是选项参数的参数之后指定某些选项的情况?换句话说,是否getopts
要求在所有选项和选项参数之后指定既不是选项也不是选项参数的参数?
谢谢。
答案1
是的,getopts
是以 POSIX 方式解析选项的工具(甚至在bash
GNU shell 中):
在:
cmd -abc -dxx -e yy arg -f -g
(optspec 为:abcd:e:fg
)
-f
和-g
是常规参数。getopts
就到此为止arg
。
一般来说,你会:
while getopts...
case...esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
如果您想以 GNU 方式处理选项,其中在非选项参数之后考虑选项(除非--
环境中存在 或 POSIXLY_CORRECT 时),您可以使用util-linux
或 busybox 实现来getopt
代替(使用不同的 API)。该选项还支持长选项。但它不能移植到 Linux 之外。
你做类似的事情:
parsed_opts=$(getopt -o abcd:e:fg -l long -- "$@") || usage
eval "set -- $parsed_opts"
for o do
case $o in
(-[abcfg]) echo "no-arg option: $o"; shift;;
(--long) echo "long option"; shift;;
(-[de]) printf '%s\n' "option $o with arg $2"; shift 2;;
(--) shift; break;;
(*) echo "never reached";;
esac
done
echo Remaining args:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
请注意,它们将在该选项中进行一些重新排序,并且它们的参数将从“剩余参数”中删除:
$ busybox getopt -o abcd:e:fg -l long -- -a foo bar -e x baz --l
-a -e 'x' --long -- 'foo' 'bar' 'baz'