Mac OS: Bash GetOpts 有时被忽略

Mac OS: Bash GetOpts Sometimes Ignored

我在 bash_profile 中写了一个小 bash 脚本。我想使用 getopts 来解析选项。

deployMenu() {
  noInstallDependencies='false'
  build='true'
  echo "Args: $@"

  while getopts 'db' flag; do
    echo "flag ${flag}"
    case "${flag}" in
      d) noInstallDependencies='true' ;;
      b) build='false' ;;
      #*) echo "Unexpected option ${flag}" ;;
      #\?) echo "Unexpected option ${flag}" ;;
    esac
  done

  echo "noInstallDependencies $noInstallDependencies"
  echo "build $build"

如果我多次运行命令,参数将被忽略。我必须运行 diff。标记以便识别它。

User:project User$ deployMenu -b
Args: -b
noInstallDependencies false
build true

User:project User$ deployMenu -b
Args: -b
noInstallDependencies false
build true

User:project User$ deployMenu --b -b
Args: --b -b
flag b
noInstallDependencies false
build false

User:project User$ deployMenu --b -b
Args: --b -b
noInstallDependencies false
build true

如您所见,仅在将参数从 -b 更改为 --<something> -b 后才能识别标志。我首先认为第一个参数被忽略了,但是 运行ning 两次 --b -b 也失败了。是否有任何缓存或任何东西要先重置?首先使用 -b 然后切换到 --b -b 使其工作是可重现的。

由于您在同一 shell 实例中重复调用 shell 函数,因此 $OPTIND 的值不会在调用 deployMenu 之间重置。这会影响 getopts 每次被调用时哪个选项被视为 "next"。使用 deployMenu ...; echo $OPTIND 尝试相同的实验。如果您计划多次调用 deployMenu,解决方案可能只是显式设置 OPTIND=1

deployMenu() {
  noInstallDependencies='false'
  build='true'
  echo "Args: $@"
  OPTIND=1

  while getopts 'db' flag; do
   ...
}