Ich möchte in Bash ein Array erstellen, das alle aktiven Netzwerkschnittstellen enthält.
Ich habe es geschafft, eine for-Schleife zu erstellen, aber wenn ich versuche, das Array zu erstellen, enthält es nur die letzte lo
Schnittstelle, aber nicht die andere. Das ist mein Code:
#!/bin/bash
for iface in $(ifconfig | cut -d ' ' -f1| tr ':' '\n' | awk NF)
do
printf "$iface%s\n"
declare -a array_test=["$iface"]
done
for i in "${array_test[@]}"; do echo "$i"; done
Und das ist meine Ausgabe:
eno1
eno2
eno3
lo
[lo]
Wie kann ich auch die lo localhost-Schnittstelle vom Array ausschließen?
linux
bash
networking
ifconfig
Georgé Stoyanov
quelle
quelle
bash
kann für recht komplexe Skripte verwendet werden (wie z. B.ksh
oderzsh
) .... aber je komplexer es ist, desto schwieriger ist es zu lesen, zu verstehen und zu ändern - und desto langsamer wird es (z. B. eine Schleife umher) Das Gabeln mehrerer Programme ist unglaublich langsam. Zu diesem Zeitpunkt übersteigen die Zeit- / Aufwandskosten für das Schreiben und Verwalten eines Shell-Skripts die Kosten für das Erlernen der Grundlagenawk
(oderperl
oder oderpython
) und das Umschreiben in etwa 1/10 der Codezeilen erheblich . Wenn Sie bereits eine dieser Sprachen kennen, ist dieser Punkt viel früher erreicht.Antworten:
Hier ist eine Lösung, weisen Sie die Liste zu und fügen Sie ihr dann ein Element hinzu:
Wenn die Ausgabe ein Element pro Zeile anzeigen soll:
So entfernen Sie localhost aus der Ausgabe:
quelle
lo
localhost-Schnittstelle vom Array ausschließen?unset "net_array[${#net_array[@]}-1]"
Mein Versuch:
quelle
bash
erstellt ein Array aus einer durch Leerzeichen getrennten Liste (Leerzeichen, Tabulatoren, Zeilenumbrüche), die Sie ihm geben. zBarray=(a b c)
. Wir können den Befehl substitution ($()
) verwenden, um eine solche durch Leerzeichen getrennte Liste zu generieren. Zum Beispiel:und drucken Sie nun das soeben erstellte Array aus:
Ausschließen
lo
:Wenn Sie wirklich
ifconfig
eher als verwenden möchtenip
, versuchen Sie Folgendes:quelle
ifconfig
gibt nur die Schnittstellen aus, die aktiv sind.Unter Linux können Sie eine Liste der Schnittstellen im
/sys/class/net
Verzeichnis abrufen. Mitzsh
können Sie also Folgendes tun:Ausschließen
lo
:Für nur
up
diejenigen, die Sie tun könnten:oder unter der Annahme des Standardwerts von
$IFS
.Auf meinem System ist zumindest der Status für
lo
UNBEKANNT, würde also ausgeschlossen.Dies würde auch mit
bash
bereitgestellten Schnittstellennamen funktionieren, die keine Platzhalterzeichen enthalten. In neueren Versionen von Linux, IIRC enthalten Schnittstellennamen garantiert keine Leerzeichen und Zeilenumbrüche (Standardeinstellung$IFS
), sodass diese keine Probleme verursachen. Andere Unicode-Leerzeichen sind jedoch zulässig, daher LC_ALL = C, was garantieren sollte, dassawk
diese nicht geteilt werden.quelle
Wenn Sie '-j' für
ip
(json-Ausgabe) unterstützen, verwenden Sie das hervorragendejq
Dienstprogramm.(Beispiel von einem Kubernetes-Knoten)
quelle