如何使用 getopts 忽略无效参数并继续解析?

ken*_*orb 5 syntax bash shell arguments getopts

我有以下简单的代码:

#!/usr/bin/env bash
while getopts :f arg; do
  case $arg in
    f) echo Option $arg specified. ;;
    *) echo Unknown option: $OPTARG. ;;
  esac
done
Run Code Online (Sandbox Code Playgroud)

它适用于简单的场景,例如:

$ ./test.sh -f
Option f specified.
$ ./test.sh -a -f
Unknown option: a.
Option f specified.
Run Code Online (Sandbox Code Playgroud)

但是它不适用于以下情况:

$ ./test.sh foo -f

$ ./test.sh -a abc -f
Unknown option: a.
Run Code Online (Sandbox Code Playgroud)

如何修复上述代码示例以支持无效参数?

ken*_*orb 5

getopts一旦找到一些未知的非选项参数(abc),它似乎只是退出循环。

我通过将getopts循环包装到另一个循环中找到了以下解决方法:

#!/usr/bin/env bash
while :; do
  while getopts :f arg; do
    case $arg in
      f)
        echo Option $arg specified.
        ;;
      *)
        echo Unknown option: $OPTARG.
        ;;
    esac
  done
  ((OPTIND++)) 
  [ $OPTIND -gt $# ] && break
done
Run Code Online (Sandbox Code Playgroud)

然后跳过无效参数并在达到最大参数时中断循环。

输出:

$ ./test.sh abc -f
Option f specified.
$ ./test.sh -a abc -f
Unknown option: a.
Option f specified.
Run Code Online (Sandbox Code Playgroud)