
Hier ist die Ausgabe von:
sudo iwlist scan 2>/dev/null | grep ESSID | sed 's/.*ESSID:"\(.*\)".*/\1/' 2>/dev/null
Yash Shah Kernfragment KernFragment_5G Kernfragment dlink Yash Shah COMFAST Appbirds_Technologies SYMBIOSE 20096641 KernFragment_5G AMBER_AP1 REDWING LABS_5G
Wenn man dasselbe in ein Skript schreibt, funktioniert es nicht immer gleich.
Hier ist ein Snippet, in dem ich den obigen Befehl verwendet habe.
for ssid_name in $(sudo iwlist scan 2>/dev/null | grep ESSID | sed 's/.*ESSID:"\(.*\)".*/\1/' 2>/dev/null)
do
echo "$ssid_name"
done
Ich habe folgende Ausgabe erhalten:
Yash Schah Kernfragment KernFragment_5G Kernfragment Yash Schah ROTER FLÜGEL LABORE COMFAST Appbirds_Technologies SYMBIOSE KernFragment_5G ROTER FLÜGEL LABS_5G
Notiz: Wenn die Ausgabe ein Leerzeichen enthält, wird es als neue Zeile verwendet.
Ich arbeite an Ubuntu 18.04.
Antwort1
Beachten Sie zunächst, dass es nichteinsBefehl verhält sich anders. In Ihren Codeausschnitten wird die Standardausgabe von zwei ganz unterschiedlichen Befehlen geschrieben.
Ihr erster druckt sed
die Ausgabe von , während Ihr zweiter:
- Die Ausgabe von wird (durch den Befehl substitution ) nach
sed
ersetzt ;$(...)
in
- Die resultierende Zeichenfolge wird in eine Liste von Elementen erweitert.
- Jeder Artikel wird wiederum zugewiesen
ssid_name
und von diesem gedrucktecho
.
Die Erweiterung in Punkt 2 erfolgt gemäß dem Wert des internen Feldtrennzeichens ( IFS
), der standardmäßig ist <space><tab><newline>
. SomitIhre Lösungfunktioniert, weil es for
die Aufteilung der ersetzten Zeichenfolge nur bei Zeilenumbrüchen zulässt.
Beachten Sie neben Ihrer Antwort, dass dies $'\n'
nicht portierbar ist – auch wenn diese Syntax ( $'string'
) in vielen Shells unterstützt wird.
Sie können dennoch eine Zuweisung wie diese verwenden:
IFS='
'
Eine alternative Konstruktion zum Verarbeiten von Eingabezeilen ist die Verwendung read
in einer while
Schleife:
sudo iwlist scan 2>/dev/null | grep ESSID | sed 's/.*ESSID:"\(.*\)".*/\1/' 2>/dev/null |
while IFS= read -r i; do
printf '%s\n' "$i"
done
Auch hier sed
wird jede Zeile der Ausgabe entsprechend dem Wert von aufgeteilt IFS
– der in diesem Beispiel genau auf die Nullzeichenfolge gesetzt wird, um jegliche Auswirkungen einer Wortaufteilung zu verhindern – die Zeilen würden jedoch read
unabhängig von durch getrennt bleiben IFS
.
Antwort2
Verwenden Sie besser eine while
Schleife mit read
anstelle einer for
Schleife.
sudo iwlist scan 2>/dev/null |grep ESSID | sed 's/.*ESSID:"\(.*\)".*/\1/' 2>/dev/null | while IFS= read -r ssid_name
do
echo $ssid_name
done
siehe auchhttps://mywiki.wooledge.org/BashFAQ/001
Antwort3
Durch Hinzufügen der folgenden Zeile im Code vor der For-Schleife funktionierte es in meinem Fall einwandfrei.
IFS=$'\n'