Mac OS:Bash GetOpts有时会被忽略

时间:2018-02-28 17:17:32

标签: bash macos getopts

我在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"

如果我多次运行该命令,则忽略该参数。我必须运行差异。标志,以使其得到认可。

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的参数更改后才会识别该标记。我首先想到的是第一个参数被忽略但是运行两次--b -b也失败了。是否有任何缓存或任何要重置的东西?首先使用-b然后切换到--b -b是可以重现的。

1 个答案:

答案 0 :(得分:1)

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

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

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