如何退出最近的getopts选项



我的脚本:

 run() {
     while getopts ":dr" option; do
        case "$option" in
            d) echo "__DEBUG__";;
            r) echo "__RELEASE__";;
        esac
    done
 if [ $option -eq ""]
    then 
      echo "__DEBUG__" ; 
 fi
}

嗨,我正在使用 zsh。当我调用没有任何选项的运行时

$ 运行

$ __ 调试 __

第一次没关系,显示调试

然后我使用选项 (d/r( 调用并再次调用 run 没有重复,它显示此错误

$ run -r

$ __ 发布 __

$ 运行

$ run-9:解析错误:预期条件:r

我不知道如何解决这个问题,似乎while循环仍然有效

您需要在

函数开始时的getopts调用之前重置OPTIND,在这种情况下不会自动完成。在 bash 中,它设置为在 shell 或 shell 脚本启动时1,但在调用函数时不设置为。

这似乎是POSIX getopts指定的。

每当调用 shell 时,OPTIND 应初始化为 1。

zsh getopts 的行为不同(感谢@PesaThe(:

OPTIND的初始值为 1,通常在进入 shell 函数时设置为 1,并在退出时恢复。

此外,当getopts完成解析后,option将设置为 ? ,这不会帮助您确定是否提供了(有效(选项。

尝试这样的事情:

run() {
  OPTIND=1
  found=0
  while getopts ":dr" option; do
    case "$option" in
      d) echo "__DEBUG__"; found=1 ;;
      r) echo "__RELEASE__"; found=1 ;;
    esac
  done
  if [ $found -eq 0 ]
  then
    echo "__DEBUG__" ; 
  fi
}

或者更简单一点(但与您的不同,以说明(:

run() {
  OPTIND=1
  mode="__DEFAULT__"
  while getopts ":dr" option; do
    case "$option" in
      d) mode="__DEBUG__" ;;
      r) mode="__RELEASE__" ;;
    esac
  done
  echo "$mode"
}

最新更新