如果未命名参数位于命名参数之前,getopts 会忽略所有参数(“./foo unnamed -nnamed”)

gam*_*men 5 bash command-line getopts

我试图理解为什么getopts如果“未命名”参数在任何命名参数之前似乎会忽略所有参数。

使用http://wiki.bash-hackers.org/howto/getopts_tutorial中的示例,

#!/bin/bash

while getopts ":a" opt; do
  case $opt in
    a)
      echo "-a was triggered!" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done
Run Code Online (Sandbox Code Playgroud)

并观察结果:

$ ./opt_test
$ ./opt_test -a
-a was triggered!
$ ./opt_test -a -f
-a was triggered!
Invalid option: -f
$ ./opt_test a -a -f
$ ./opt_test a -a
$ ./opt_test a -f
$ ./opt_test lala -f
$ 
Run Code Online (Sandbox Code Playgroud)

因此,在前面添加一个未命名的参数(没有破折号的参数)似乎会getopts忽略所有参数。

这是为什么?我该如何解决这个问题?我希望我的程序能够捕获此类内容并打印使用屏幕。

Ada*_*man 2

引用getopts 文档

“以下任何一项都应标识选项的结尾:特殊选项“--”、查找不以“-”开头的参数或遇到错误。”

解释性说明:

  1. getopts()支持实用语法指南 opengroup.org, 2023。它将命令行语法定义为UTILITY_NAME OPTION+ARGUMENTS OPERANDS,它们调用未命名参数OPERANDS
  2. Open Group 的存在是为了简化与其他人代码的集成。遵循他们的实用语法指南将降低代码维护的复杂性。这些与您的问题相关:
  1. 一个选项可以指定多个参数,参数之间用逗号分隔
  2. 命令行上的选项应位于操作数(未命名)之前。
  3. -- 表示没有更多选项,所有后续参数都是操作数。