Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mac OS:Bash GetOpts有时被忽略_Bash_Macos_Getopts - Fatal编程技术网

Mac OS:Bash GetOpts有时被忽略

Mac OS:Bash GetOpts有时被忽略,bash,macos,getopts,Bash,Macos,Getopts,我在我的bash_档案中写了一个小bash脚本。我想使用getopts解析选项 deployMenu() { noInstallDependencies='false' build='true' echo "Args: $@" while getopts 'db' flag; do echo "flag ${flag}" case "${flag}" in d) noInstallDependencies='true' ;; b) bui

我在我的bash_档案中写了一个小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
更改为
--b
后,才能识别该标志。我最初认为第一个参数被忽略了,但是运行两次
--b-b
也失败了。是否有缓存或任何需要先重置的内容?首先使用
-b
然后切换到
--b-b
使其工作是可复制的。

由于在同一个shell实例中重复调用shell函数,因此在调用
部署菜单
之间不会重置
$OPTIND
的值。这会影响每次调用哪个选项时将其视为“下一个”。使用
deployMenu…,尝试同样的实验。。。;echo$OPTIND
。如果您计划多次调用
deployMenu
,那么解决方案可能只是显式设置
OPTIND=1

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

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

getopts
不支持像
--b
这样的长选项。Thx,我知道问题是它被忽略了-bI也只能使用-b,它仍然被忽略。这只是一个仅在更改args时才起作用的示例。