我在shell脚本中做了一些选项解析,意图是在dash
和bash
中进行内容,我在bash
得到了一些奇怪的结果,所以我把脚本的本质在:
./ getopts:
fn()
{
local verbose opt
while getopts "v" opt; do
case "$opt" in v) verbose=1;; ?) return 1;; esac
done; shift $((OPTIND - 1))
echo -n "'$verbose' "
}
fn -v; fn -v; fn -v; printf '\n'
并使用不同的(local
- 支持)shell运行它:
for sh in bash dash posh zsh; do echo SH=$sh; $sh ./getopts; done
我得到的结果是:
SH=bash
'1' '' ''
SH=dash
'1' '1' '1'
SH=posh
'1' '' '1'
SH=zsh
'1' '1' '1'
这些差异的原因是什么?问题是bash
和posh
还是我的脚本?
答案 0 :(得分:2)
您需要在OPTIND
循环之前将1
设置回getopts
,因此它将从第一个参数开始。
在bash
中,OPTIND
仅在脚本启动时自动初始化,zsh
和dash
在输入功能时初始化,并恢复为从函数返回时的旧值。我不确定posh
是做什么的。
根据zsh
文档,您可以通过设置bash
选项使其与POSIX_BUILTINS
类似。从名称来看,我认为bash
行为与POSIX要求一致,zsh
和dash
存在冲突。