2017-07-03 1 views
0

は私がdashbashでinsourcedされることを意味し、シェルスクリプトで解析するいくつかのオプションをした、と私は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 -supporting)シェルでこれを実行しました:

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

OPTINDgetoptsループの前に戻して1に戻す必要があるため、最初の引数から開始します。

bashでは、OPTINDは、スクリプトが起動したときにのみzshに、自動的に初期化され、機能に入るときdashは、それが初期化されますと、関数からの復帰時に元の値に復元します。私はposhが何をしているのか分かりません。

zshのマニュアルによれば、POSIX_BUILTINSオプションを設定することによって、bashと同様に動作させることができます。名前から、私はbashの動作がPOSIXの要件と一致し、zshdashが競合していると仮定します。

+0

ありがとうございました。 SOが私を許可するときに受け入れます。 – PSkocik

関連する問題