Asch-Scripting: Die Variable mit dem Leerzeichen lehnt es ab, grepped zu werden

1392
Nick Alexander

Ich versuche, das unter http://talk.maemo.org/showthread.php?t=70866&page=2 aufgelistete Skript auf der vorgesehenen Hardware eines Nokia Linux-Telefons mit BusyBox ash auszuführen. Das Skript erhält den Namen des WLAN-Netzwerks als Parameter und versucht, das Telefon damit zu verbinden. Ich vermute, das Skript funktioniert, aber meine SSID, BU (802.1x), enthält Platz und Klammern. Also wenn ich an der Eingabeaufforderung tippe

autoconnect.sh BU\ \(802.1x\) 

Ich bekomme verschiedene Fehler. Zuerst,

LIST=`iwconfig wlan0 | awk -F":" '/ESSID/'` if [ $LIST = "\"$1\"" ]; then 

... schlägt fehl, auch wenn ich mit dem Netzwerk verbunden bin. Der Fehler wird nicht durch die Verwendung von einfachen oder doppelten Anführungszeichen anstelle von Escape-Zeichen an der Eingabeaufforderung vermieden.

Zweite,

if [ -z `iwlist wlan0 scan | grep -m 1 -o \"$1\"` ]; then echo SSID \"$1\" not found; 

zeigt an, dass grep die Zeichenfolge nicht findet, obwohl dasselbe grep, das direkt in die Eingabeaufforderung eingegeben wurde, 'BU (802.1x)' findet .

Wie zitiere ich $ 1 in den beiden oben genannten Umständen, damit es mit meiner Netzwerk-SSID mit Leerzeichen und Klammern funktioniert?

Vielen Dank.

3

2 Antworten auf die Frage

2
Ярослав Рахматуллин

Bei der Ausgabe von wird iwconfigder Name des Zugangspunkts in doppelte Anführungszeichen gesetzt, was zu einer Verrückung führt. Der Autor des Skripts behandelt dieses "Artefakt" in seinem Skript, anstatt es sofort loszuwerden. Ich schlage vor, die Anführungszeichen zu entfernen, bevor Sie etwas anderes tun. Zwei mögliche Ansätze wären:

$ eval moo=`iwconfig wlan0 | awk -F":" '/ESSID/' ` $ moo=`iwconfig wlan0 | awk -F":" '/ESSID/' |tr -d \"` 

Der erste führt die Anweisung zur Variablenzuweisung "wörtlich" aus, während der andere doppelte Anführungszeichen aus der Ausgabezeichenfolge entfernt.

Das zweite Problem des Skripts besteht in der Annahme, dass $ LIST ohne Anführungszeichen verwendet werden darf (da der String doppelte Anführungszeichen enthalten hätte). Ich denke, das ist ein Fehler, da die Zeichenfolge immer noch als zwei Token ausgewertet wird:

$ moo='"aaa bbb"' $ if [ $moo = "\"aaa bbb\""];then ok;fi ash: bbb": unknown operand  $ if [ "$moo" = "\"aaa bbb\"" ];then echo ok;fi ok 

Um dies zu beheben, zitieren Sie die Parameter in den eckigen Klammern und entfernen Sie die mit Escapezeichen versehenen Anführungszeichen im zweiten Argument (da wir sie aus der iwconfig-Ausgabe entfernt haben):

if [ "$LIST" = "$1" ]; then ... 

Um einen String mit unregelmäßigen Zeichen (Leerzeichen, Klammern) als ein Argument an ein Skript zu übergeben, zitieren Sie es einfach:

$ autoconnect.sh "a name (with a comment)" 

Der letzte Teil zur Übereinstimmung des Namens mit grep wurde von glenn jackman bereits ausreichend beantwortet.

Hinweis: Das obige wurde mit BusyBox ash (1.20.2) getestet.

Vielen Dank, ich wünschte, ich könnte beide Antworten als akzeptiert markieren. Beide haben gut funktioniert, oder zumindest scheint es so. Leider gelingt das Skript nie, weil die nächste Zeile eine Awk ist, bei der jeder Platz umgangen werden muss. Wird es als separate Frage posten. Nick Alexander vor 11 Jahren 0
1
glenn jackman

Versuchen Sie nicht, wörtliche Anführungszeichen hinzuzufügen. Sie benötigen if [ "$LIST" = "$1" ]; .... Beide Variablen müssen in Anführungszeichen gesetzt werden, damit der Testbefehl genau 3 Argumente erhält. Dies ist besonders wichtig, da die Werte Leerzeichen enthalten.

Gleicher Rat für den zweiten: if [ -z $(iwlist wlan0 scan | grep -m 1 -o "$1") ]; ...

Der bessere Weg, um das oben zu schreiben: if iwlist wlan0 scan | grep -q "$1"; ...