Bash手册说
Run Code Online (Sandbox Code Playgroud)getopts optstring name [args]
当遇到选项结束时,
getopts
以大于零的返回值退出。OPTIND
设置为第一个非选项参数的索引并name
设置为?
。
是不是意味着
getopts
只读取选项和选项参数,而不是既不是选项也不是选项参数的参数?
getopts
无法处理在命令行中,某些选项在某些既不是选项也不是选项参数的参数之后指定的情况?换句话说,是否getopts
需要在所有选项和选项参数之后指定既不是选项也不是选项参数的参数?
谢谢。
是的,getopts
是以 POSIX 方式解析选项的工具(即使在bash
GNU shell 中):
在:
cmd -abc -dxx -e yy arg -f -g
Run Code Online (Sandbox Code Playgroud)
(带有 optspec :abcd:e:fg
)
-f
并且-g
是常规参数。getopts
到此为止arg
。
通常,您会这样做:
while getopts...
case...esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
Run Code Online (Sandbox Code Playgroud)
如果您想以 GNU 方式处理选项,其中在非选项参数之后考虑选项(除非环境中有 a--
或 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' "$@"
Run Code Online (Sandbox Code Playgroud)
请注意,它们将在该选项中进行一些重新排序,并且它们的参数将从“剩余参数”中删除:
$ busybox getopt -o abcd:e:fg -l long -- -a foo bar -e x baz --l
-a -e 'x' --long -- 'foo' 'bar' 'baz'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3126 次 |
最近记录: |