ubuntuusers.de

In BASH-Script Variablen mit Sonderzeichen vergleichen

Status: Gelöst | Ubuntu-Version: Server 25.04 (Plucky Puffin)
Antworten |

bytegetter

Anmeldungsdatum:
2. November 2018

Beiträge: 6

Hallo zusammen,

Ich habe hier ein Script:

1
2
3
if [[ $string == "wurst[frosch,1]" ]]; then
    echo $string
fi

Das funktioniert solange ich keine eckigen Klammern nutze. Leider sind diese im Suchstring vorhanden, so dass ich irgendwie auf wurst[frosch,1] prüfen muss. Mit Backslash vor dem Klammern geht es auch nicht.

Hat jemand eine Idee?

Gruß, Bytegetter

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 241

Wohnort: Aachen

Moin,

funktioniert hier problemlos...

thomas@PC01:~$ string="wurst[frosch,1]"
thomas@PC01:~$ if [[ $string == "wurst[frosch,1]" ]];then echo $string;fi
wurst[frosch,1]

Scheinbar ist deine Zeichenkette nicht wirklich identisch, nicht druckbare Zeichen enthalten?!

Gruß Thomas

bytegetter

(Themenstarter)

Anmeldungsdatum:
2. November 2018

Beiträge: 6

Danke für den Hinweis. Ich habe die Ausgabe in hexdump umgeleitet, dort finde ich am Ende ein 0a hex:

1
2
        echo $call_tr_outboundtrunk"aa"
        echo $call_tr_outboundtrunk | hexdump -C

Ergibt:

1
2
3
loop[goblin,] aa
00000000  6c 6f 6f 70 5b 67 6f 62  6c 69 6e 2c 5d 0a        |loop[goblin,].|
0000000e

Nach einem awk

1
'{print $32 "\t"}'

hätte ich kein 0a erwartet. Kann ich das 0a/LF im String vergleichen?

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 241

Wohnort: Aachen

bytegetter schrieb:

Ich habe die Ausgabe in hexdump umgeleitet, dort finde ich am Ende ein 0a hex:

1
2
        echo $call_tr_outboundtrunk"aa"
        echo $call_tr_outboundtrunk | hexdump -C

Den LF erzeugt der echo-Befehl selbst, wenn du den Schalter "-n" nicht angibst.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 241

Wohnort: Aachen

Du kannst natürlich auch grep verwenden, um die Zeichenkette zu überprüfen. Dort musst du die eckigen Klammern dann allerdings escapen:

1
2
3
if grep -q "^loop\[goblin,\]$" <<<$string;then
  echo $string
fi

bytegetter

(Themenstarter)

Anmeldungsdatum:
2. November 2018

Beiträge: 6

Ich habe noch mal weiter getestet.

Mit Asterisk wird der String gefunden: if [[ $call_tr_outboundtrunk == "loop[goblin,]"* ]]; then

Das ist aber nicht Sinn und Zweck des ganzen. Wieso wird der String nicht ohne Pattern gefunden? Bash ist für die Aufgabe eher ungeeignet, das ganze Script läuft ca. 4-6 Stunden. Da will ich alles unnötige vermeiden.

TK87

Anmeldungsdatum:
8. Juli 2019

Beiträge: 241

Wohnort: Aachen

Ich glaube ich habe dein Problem entdeckt...

bytegetter schrieb:

Nach einem awk

1
'{print $32 "\t"}'

hätte ich kein 0a erwartet.

Warum hängst du da am Ende den Tabstopp an? Der ist natürlich am Ende deiner Zeichenkette.

Da du beim Hexdump die Zeichenkette nicht in Anführungszeichen gesetzt hast, taucht der Tabstopp dann im dump auch nicht auf. Mache noch mal:

1
echo -n "$call_tr_outboundtrunk" | hexdump -C

sollte dann am Ende "09" auftauchen.

bytegetter

(Themenstarter)

Anmeldungsdatum:
2. November 2018

Beiträge: 6

1
call_tr_outboundtrunk=$(echo $LINE | awk '{print $33}')

Ah, jetzt geht. Und ich such den Fehler schon seit einem Jahr beim Stringvergleich. 😉

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9574

Wohnort: Münster

Wenn Du wirklich nur Zeichenketten ohne Verwendung von Shell-Globs oder regulären Ausdrücken vergleichen willst, verwende den einfachen Test statt [[ … ]]:

  • test "$a" = blablabla 
  • oder

     [ "$a" = blablabla ] 

Unabhängig davon gilt: Wenn der Wert einer Variablen eine Zeilenschaltung oder ein anderes Sonderzeichen enthält, dann ist dieses vorher zu entfernen oder in den Test einzubeziehen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13140

kB schrieb:

Wenn Du wirklich nur Zeichenketten ohne Verwendung von Shell-Globs oder regulären Ausdrücken vergleichen willst, verwende den einfachen Test statt [[ … ]]:

Danke dafür! Wäre auch genau meine Empfehlung.

  • test "$a" = blablabla 
  • oder

     [ "$a" = blablabla ] 

Oder, da die Konstante ja Sonderzeichen beinhaltet:

1
[ "$string" = 'wurst[frosch,1]' ]

Unabhängig davon gilt: Wenn der Wert einer Variablen eine Zeilenschaltung oder ein anderes Sonderzeichen enthält, dann ist dieses vorher zu entfernen oder in den Test einzubeziehen.

Ich nehme an mit "einbeziehen" meinst Du, dass es im Vergleichswert ebenfalls auftauchen muss.

Antworten |