我f
根据此处的示例(在“带参数的选项”下)在Bash中定义了该函数:
f () {
while getopts ":a:" opt; do
case $opt in
a)
echo "-a was triggered, Parameter: $OPTARG" >&2
;;
\?)
echo "Invalid option: -$OPTARG" >&2
return 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
return 1
;;
esac
done
}
尽管他们使用脚本,但我直接在shell中定义了函数。
当我第一次启动Bash并定义函数时,一切正常:f -a 123
prints -a was triggered, Parameter: 123
。但是,当我第二次运行完全相同的行时,什么也没打印。
是什么原因导致这种现象?它发生在Bash 3.2和4.3中,但是在Zsh 5.1中可以正常工作。这是令人惊讶的,因为该示例原本是针对Bash,而不是Zsh。
bash getopts使用环境变量OPTIND来跟踪处理的最后一个选项参数。OPTIND
每次getopts
在同一个shell会话中调用时,只有在调用shell时,并不会自动重置这一事实。因此,从第二次您getopts
在同一会话中使用相同的参数进行调用以来OPTIND
,getopts
它没有改变,认为它已经完成了工作,却什么也没做。
您可以OPTIND
手动重置以使其起作用:
$ OPTIND=1
$ f -a 123
-a was triggered, Parameter: 123
或者只是将函数放入脚本中并多次调用该脚本。
zsh getopts稍有不同。OPTIND
通常在每次退出Shell函数时都会重置为1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句