は、ここでシェルスクリプトです:呼び出されたときバッシュ:インクリメントグローバル変数
globvar=0
function myfunc {
let globvar=globvar+1
echo "myfunc: $globvar"
}
myfunc
echo "something" | myfunc
echo "Global: $globvar"
、それは次のように出力します:
$ sh zzz.sh
myfunc: 1
myfunc: 2
Global: 1
$ bash zzz.sh
myfunc: 1
myfunc: 2
Global: 1
$ zsh zzz.sh
myfunc: 1
myfunc: 2
Global: 2
質問です:なぜこれが起こるとどのような行動が正しいのですか?
P.S.パイプの後ろにある関数が分岐したシェルで呼び出されるという不思議な感覚があります...簡単な回避策がありますか?
P.P.S.この関数は単純なテストラッパーです。テストアプリケーションを実行し、その出力を分析します。 $ PASSEDまたは$ FAILED変数をインクリメントします。最後に、グローバル変数で多数の合格/不合格のテストを取得します。使い方は次のようである:
test-util << EOF | myfunc
input for test #1
EOF
test-util << EOF | myfunc
input for test #2
EOF
echo "Passed: $PASSED, failed: $FAILED"
おかげで、 セルジュsh
またはbash
でmyfunc
に
はあなたが読んでいますか? –
よく、私の心に$ globvarはローカル変数ではありません。なぜなら、パイプなしでmyfunc()を呼び出すと、グローバル変数$ globvarがかなり良くインクリメントされるからです。問題は、パイプ越しの関数呼び出しがbash/shでは機能しないことです。 – zserge