【问题标题】:Mac OS: Bash GetOpts Sometimes IgnoredMac OS:有时会忽略 Bash GetOpts
【发布时间】:2018-08-08 15:56:35
【问题描述】:

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

【问题讨论】:

  • getopts 不支持像--b 这样的长选项。
  • 谢谢,我知道问题是它忽略了 -b
  • 我也可以只使用 -b 并且它仍然被忽略。这只是一个示例,它仅在更改 args 时才有效。

标签: bash macos getopts


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多