bash - 如何退出最近的 getopts 选项?

标签 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

$ run

$ __ DEBUG __

第一次没问题,显示DEBUG

然后我使用选项(d/r)调用并再次不带任何参数调用run,它显示此错误

$ run -r

$ __ RELEASE __

$ run

$ run-9: parse error: condition expected: r

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

最佳答案

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

这似乎就是POSIX getopts指定。

Whenever the shell is invoked, OPTIND shall be initialized to 1.

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

OPTIND has an initial value of 1, and is normally set to 1 upon entry to a shell function and restored upon exit.

另外,当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"
}

关于bash - 如何退出最近的 getopts 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48204694/

相关文章:

linux - 当管道的第一个命令不输出时如何不输出任何内容

linux - jq 是否可以在设置新值时使用已删除的值?

bash - 列出不包含某些文件的目录?

Linux 脚本 : Saving Memory print into text file via Crontab always blank

shell - 有没有办法在 XPath 中将字符串分割成固定宽度的 block ?

shell - 如何找出shell中是否存在shell命令

linux - bash shell : Cannot use variable $ as a path to run tar

shell - 卸载 RVM 后,Zshell 启动时退出状态为 1

unix - 在 gnu screen 中加载 zsh 作为默认 shell

zsh - 进入目录时在 zsh 中获取文件