11
votes

Incrémenter une variable globale à bash

Voici un script shell: xxx pré>

Lorsque cela est appelé, il imprime les éléments suivants: p>

test-util << EOF | myfunc
input for test #1
EOF
test-util << EOF | myfunc
input for test #2
EOF
echo "Passed: $PASSED, failed: $FAILED"


2 commentaires

Avez-vous lu: tldp.org/ldp/abs/html/localvar.html?


Eh bien, à mon esprit $ GLOBVAR n'est pas une variable locale, car appeler myfunc () sans pipes augmente la variable globale $ GLOBVAR. Le problème est que la fonction d'appel sur le tuyau ne fonctionne pas dans Bash / sh.


3 Réponses :


3
votes

tuyauter quelque chose dans myfunc dans sh ou bash provoque une nouvelle coquille de reproduire. Vous pouvez le confirmer en ajoutant un long sommeil dans myfunc . Bien que cela dort, appelez PS et vous verrez un sous-processus. Lorsque la fonction renvoie, cette sous-shell sort sans modifier la valeur dans le processus parent.

Si vous avez vraiment besoin de la modification de la valeur, vous devez retourner une valeur de la fonction et vérifier $ pipestatus après, je suppose , comme ceci: xxx


2 commentaires

Frais. Je ne savais pas sur Pipestatus avant.


Le seul problème avec cette technique est que votre valeur de retour doit être comprise entre 0 et 255.



7
votes

2 commentaires

Merci pour le lien! La question est de passer à deux variables: $ passée et $ a échoué. Je comprends que je peux rechercher $?, Si cela équivaut à zéro - incrément $ passée par mystérique, sinon - incrément $ échoué. Je voudrais juste aussi petit code que possible en dehors de la myfunc ().


@zserge: une solution serait comme ceci: myfunc () {echo "deux mots"; }; Lire Word1 Word2 <<< $ (myfunc) ou array = ($ (myfunc)) .



0
votes

Le problème est "Quelle extrémité d'un pipeline utilisant des intégrées est exécutée par le processus d'origine?"

Dans ZSH, on dirait que la dernière commande du pipeline est exécutée par le script shell principal lorsque la commande est une fonction ou intégrée.

en bash (et sh est susceptible d'être un lien pour baster si vous êtes sous Linux), alors que les deux commandes sont exécutées dans une sous-coquille ou la première commande. est exécuté par le processus principal et les autres sont exécutés par des sous-coquilles.

Clairement, lorsque la fonction est exécutée dans une sous-coque, elle n'affecte pas la variable dans la coque mère (uniquement le monde Dans la sous-coquille).

envisagez d'ajouter un test supplémentaire: xxx


0 commentaires