Schrittweite eine Globale variable in der Bash

Hier ist ein shell-Skript:

globvar=0

function myfunc {
  let globvar=globvar+1
  echo "myfunc: $globvar"
}

myfunc
echo "something" | myfunc

echo "Global: $globvar"

Wenn angerufen wird, druckt das folgende:

$ 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

Die Frage ist: warum dies geschieht, und welches Verhalten ist richtig?

P. S. habe ich ein komisches Gefühl, dass die Funktion hinter dem Rohr in einer Gabel-Schale... Also, kann es da einen einfachen workaround?

P. P. S. Diese Funktion ist ein einfacher test wrapper. Es läuft die test-Anwendung, und analysiert die Ausgabe. Dann Schritten von $ÜBERGEBEN oder $FEHLGESCHLAGEN Variablen. Schließlich, Sie erhalten eine Anzahl der bestandenen/fehlerhaften tests, die in der globalen Variablen. Die Nutzung ist wie:

test-util << EOF | myfunc
input for test #1
EOF
test-util << EOF | myfunc
input for test #2
EOF
echo "Passed: $PASSED, failed: $FAILED"
  • Haben Sie gelesen: tldp.org/LDP/abs/html/localvar.html ?
  • naja, meiner Meinung nach $globvar ist nicht eine lokale variable, weil der Aufruf von myfunc() ohne pipe inkrementiert die Globale variable $globvar ziemlich gut. Das problem ist, dass die aufrufende Funktion über Rohr nicht funktioniert in bash/sh.
InformationsquelleAutor zserge | 2010-11-23
Schreibe einen Kommentar