Ich verwende die folgende Funktion, um ein externes Skript zu erhöhen. Der Hauptzweck besteht darin, einige Daten aus den ifconfig- und Ping-Testausgaben zurückzugeben. Ich versuche, sie mithilfe von Variablen in derselben Funktion festzulegen, nur um einige andere „Pipes“ zu erstellen und sie erneut mit anderen Informationen zu verknüpfen. Aber ich habe dieses Verhalten. Im Grunde versuche ich Folgendes zu tun:
> for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | a=`echo $i-$(cut -d,
-f3)` | echo $a; done
4
4
4
4
Wie Sie sehen, wird für jede Iteration die Zahl 4 zurückgegeben.
Wenn ich einfach die Variablenzuordnung entferne, erhalte ich die Ausgabe, die ich zunächst in der Variable „a“ erwartet hatte:
> for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f 3 | cut -d: -f2) ; do ping -c1 $i | grep packet | echo $i-$(cut -d, -f3); done
10.0.2.15- 0% packet loss
192.168.0.2- 0% packet loss
10.0.2.100- 0% packet loss
127.0.0.1- 0% packet loss
- Warum erhalte ich bei der ersten Funktionscodeausführung die Nummer 4 als Ausgabe?
- Wie kann ich eine Variable innerhalb derselben Funktion festlegen und sie nach einigen Pipelines erneut ausgeben? Ist das möglich?
Beste grüße !
Antwort1
for i in $(...) ; do ... | a=`...` | echo $a; done
Warum erhalte ich bei der ersten Funktionscodeausführung die Nummer 4 als Ausgabe?
Weil a=`...`
und echo $a
in unterschiedlichen Subshells/Unterprozessen ausgeführt werden. a=1; a=3 | echo $a
wird in jeder Shell gedruckt 1
. Es gibt keine Möglichkeit, eine Variable von einer Subshell an ihr übergeordnetes Element zu übergeben.
Wie kann ich eine Variable innerhalb derselben Funktion festlegen und sie nach einigen Pipelines erneut ausgeben? Ist das möglich?
Nein. Sofern Sie es nicht im Hauptskript vor der Pipeline festlegen.
Antwort2
Wenn Sie den letzten Teil der Pipeline mit neu strukturieren, sed
können Sie meiner Meinung nach erreichen, was Sie wollen. Das sed
Skript gleicht die gesamte Standardeingabe ab und ersetzt sie durch den Wert von $i
gefolgt von -
und dem dritten Feld Ihrer ping
Ausgabe (von stdin). Zum Beispiel:
$ for i in $(ifconfig | grep "inet addr" | tr -s " " | cut -d" " -f3 | cut -d: -f2); do \
ping -c1 $i | grep packet | cut -d, -f3 | sed "s/\(.*\)/$i - \\1/"; \
done
123.145.167.189 - 0% packet loss
127.0.0.1 - 0% packet loss