2017-07-03 41 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