Bitte erklären Sie mir, warum die allerletzte echo
Aussage leer ist. Ich erwarte, dass dies XCODE
in der while-Schleife auf einen Wert von 1 erhöht wird:
#!/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
Ich habe versucht, die folgende Anweisung anstelle der ++XCODE
Methode zu verwenden
XCODE=`expr $XCODE + 1`
und es wird auch nicht außerhalb der while-Anweisung gedruckt. Ich glaube, ich vermisse hier etwas über den variablen Bereich, aber die alte Manpage zeigt es mir nicht.
Antworten:
Da Sie in die while-Schleife einleiten, wird eine Unter-Shell erstellt, um die while-Schleife auszuführen.
Jetzt hat dieser untergeordnete Prozess eine eigene Kopie der Umgebung und kann keine Variablen an seinen übergeordneten Prozess zurückgeben (wie bei jedem Unix-Prozess).
Daher müssen Sie eine Umstrukturierung vornehmen, damit Sie nicht in die Schleife eintauchen. Alternativ können Sie beispielsweise eine Funktion ausführen und
echo
den gewünschten Wert vom Unterprozess zurückgeben.http://tldp.org/LDP/abs/html/subshells.html#SUBSHELL
quelle
Das Problem ist, dass mit einer Pipe zusammengestellte Prozesse in Subshells ausgeführt werden (und daher eine eigene Umgebung haben). Was auch immer innerhalb
while
des Rohrs passiert, wirkt sich nicht auf etwas außerhalb des Rohrs aus.Ihr spezifisches Beispiel kann gelöst werden, indem Sie die Pipe in umschreiben
oder vielleicht
quelle
vimdiff <(grep WARN log.1 | sort | uniq) <(grep WARN log.2 | sort | uniq)
jeden Tag. Bedenken Sie, dass Sie mehrere gleichzeitig verwenden und wie Dateien behandeln können ... MÖGLICHKEITEN!Dies sollte auch funktionieren (da sich Echo und While in derselben Subshell befinden):
quelle
Noch eine Option:
EDIT: Hier ist xsel eine Voraussetzung (installieren Sie es). Alternativ können Sie xclip:
xclip -i -selection clipboard
anstelle von verwendenxsel -i -p
quelle
Überprüfen Sie, ob diese Änderungen hilfreich sind
quelle
Eine andere Möglichkeit besteht darin, die Ergebnisse aus der Subshell in eine Datei auszugeben und sie dann in der übergeordneten Shell zu lesen. etwas wie
quelle
Ich habe das umgangen, als ich mein eigenes kleines Du gemacht habe:
Der Punkt ist, dass ich mit () eine Subshell mache, die meine SUM-Variable und das while enthält, aber ich pfeife in das ganze () anstatt in das while selbst, was das Gotcha vermeidet.
quelle