getopts 是否按某种顺序读取命令行参数?

getopts 是否按某种顺序读取命令行参数?

Bash 手册说

getopts optstring name [args]

当遇到选项末尾时,getopts退出并返回大于零的值。OPTIND设置为第一个非选项参数的索引并name设置为?

是不是意味着

  • getopts只读取选项和选项参数,而不读取既不是选项也不是选项参数的参数?

  • getopts无法处理在命令行中在某些既不是选项也不是选项参数的参数之后指定某些选项的情况?换句话说,是否getopts要求在所有选项和选项参数之后指定既不是选项也不是选项参数的参数?

谢谢。

答案1

是的,getopts是以 POSIX 方式解析选项的工具(甚至在bashGNU 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'

相关内容