如何退出最近的getopts选项?

时间:2018-01-11 10:21:27

标签: bash shell zsh 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。当我打电话运行时没有任何选项

  

$ run

     

$ __ DEBUG __

第一次没问题并显示 DEBUG

然后我用选项(d / r)打电话并再次呼叫运行而没有再次显示此错误

  

$ run -r

     

$ __ RELEASE __

     

$ run

     

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

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

1 个答案:

答案 0 :(得分:2)

您需要在功能开始时OPTIND调用之前重置getopts,在这种情况下,这不会自动完成。在bash中,当shell或shell脚本启动时,它被设置为1,但是在调用函数时则不会。{/ p>

这似乎是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"
}