Mac OS:Bash GetOpts有时会被忽略

问题描述 投票:1回答:1

我在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是可重现的。

bash macos getopts
1个回答
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
   ...
}
© www.soinside.com 2019 - 2024. All rights reserved.