如何退出最近的 getopts 选项?
How to exit recent getopts options?
我的脚本:
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: 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"
}
我的脚本:
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: 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"
}