2017-07-03 68 views
0

我做了一些选项,意味着dashbash被内包一个shell脚本解析,我在bash得到了一些奇怪的结果,所以我把剧本的精髓:非常不同getopts的结果与不同的炮弹

./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 - 支持)弹跑这样的:

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' 

这些不一致的原因是什么? bashposh或我的脚本有问题吗?

回答

2

您需要将OPTIND设置回1之前的getopts循环,因此它将从第一个参数开始。

bashOPTIND是脚本启动,只有当自动初始化,在zshdash进入函数时,它的初始化,并且在函数返回时恢复到它原来的值。我不确定posh是做什么的。

根据zsh文档,可以通过设置POSIX_BUILTINS选项使其与bash类似。从名称来看,我认为bash的行为与POSIX的要求是一致的,zshdash是冲突的。

+0

谢谢。 SO会让我接受。 – PSkocik