我的剧本:
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循环仍然有效
答案 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"
}