Veuillez m'expliquer pourquoi la toute dernière echo
déclaration est vide? Je m'attends à ce que cela XCODE
soit incrémenté dans la boucle while à une valeur de 1:
#!/bin/bash
OUTPUT="name1 ip ip status" # normally output of another command with multi line output
if [ -z "$OUTPUT" ]
then
echo "Status WARN: No messages from SMcli"
exit $STATE_WARNING
else
echo "$OUTPUT"|while read NAME IP1 IP2 STATUS
do
if [ "$STATUS" != "Optimal" ]
then
echo "CRIT: $NAME - $STATUS"
echo $((++XCODE))
else
echo "OK: $NAME - $STATUS"
fi
done
fi
echo $XCODE
J'ai essayé d'utiliser la déclaration suivante au lieu de la ++XCODE
méthode
XCODE=`expr $XCODE + 1`
et il ne s'imprimera pas non plus en dehors de l'instruction while. Je pense qu'il me manque quelque chose sur la portée variable ici, mais la vieille page de manuel ne me le montre pas.
Réponses:
Comme vous effectuez un piping dans la boucle while, un sous-shell est créé pour exécuter la boucle while.
Maintenant, ce processus enfant a sa propre copie de l'environnement et ne peut pas renvoyer de variables à son parent (comme dans n'importe quel processus unix).
Par conséquent, vous devrez vous restructurer pour ne pas vous lancer dans la boucle. Vous pouvez également exécuter une fonction, par exemple, et
echo
la valeur que vous souhaitez renvoyer par le sous-processus.http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
la source
Le problème est que les processus assemblés avec un tube sont exécutés dans des sous-shell (et ont donc leur propre environnement). Tout ce qui se passe dans le
while
n'affecte rien à l'extérieur du tuyau.Votre exemple spécifique peut être résolu en réécrivant le tube en
ou peut-être
la source
vimdiff <(grep WARN log.1 | sort | uniq) <(grep WARN log.2 | sort | uniq)
tous les jours. Considérez que vous pouvez en utiliser plusieurs à la fois et les traiter comme des fichiers ... POSSIBILITÉS!Cela devrait également fonctionner (car echo et while sont dans le même sous-shell):
la source
Une autre option:
EDIT: Ici, xsel est une exigence (installez-le). Vous pouvez également utiliser xclip:
xclip -i -selection clipboard
au lieu dexsel -i -p
la source
voir si ces changements aident
la source
Une autre option consiste à afficher les résultats dans un fichier à partir du sous-shell, puis à le lire dans le shell parent. quelque chose comme
la source
J'ai contourné ça quand je faisais mon propre petit du:
Le fait est que je crée un sous-shell avec () contenant ma variable SUM et le while, mais je passe dans l'ensemble () au lieu de dans le while lui-même, ce qui évite le gotcha.
la source