Voici un script shell:Bash: variable globale incrément
globvar=0
function myfunc {
let globvar=globvar+1
echo "myfunc: $globvar"
}
myfunc
echo "something" | myfunc
echo "Global: $globvar"
Quand appelé, il imprime les suivantes:
$ 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
La question est: pourquoi cela se produit et ce comportement est correct?
P.S. J'ai un sentiment étrange que la fonction derrière le tuyau est appelée dans une coquille fourchue ... Alors, peut-il y avoir une solution de contournement simple?
P.P.S. Cette fonction est un wrapper de test simple. Il exécute une application de test et analyse sa sortie. Ensuite, il incrémente les variables $ PASSED ou $ FAILED. Enfin, vous obtenez un certain nombre de tests réussis/échoués dans les variables globales. L'utilisation est comme:
test-util << EOF | myfunc
input for test #1
EOF
test-util << EOF | myfunc
input for test #2
EOF
echo "Passed: $PASSED, failed: $FAILED"
Merci, Serge
Avez-vous lu: http://tldp.org/LDP/abs/html/localvar.html? –
Eh bien, à mon avis $ globvar n'est pas une variable locale, car l'appel de myfunc() sans un tube incrémente assez bien la variable globale $ globvar. Le problème est que la fonction d'appel sur le canal ne fonctionne pas dans bash/sh. – zserge