Verhalten der Variablenerstellung innerhalb der Bash-Funktion

Verhalten der Variablenerstellung innerhalb der Bash-Funktion

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 $ain unterschiedlichen Subshells/Unterprozessen ausgeführt werden. a=1; a=3 | echo $awird 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, sedkönnen Sie meiner Meinung nach erreichen, was Sie wollen. Das sedSkript gleicht die gesamte Standardeingabe ab und ersetzt sie durch den Wert von $igefolgt von -und dem dritten Feld Ihrer pingAusgabe (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

verwandte Informationen