BASH; Merkwürdiges Verhalten bei Zeichenkettenvergleich

Antworten
Nachricht
Autor
psychodad

BASH; Merkwürdiges Verhalten bei Zeichenkettenvergleich

#1 Beitrag von psychodad » 12. Mai 2006 15:54

Hallo,

folgendes Shell-Skript

Code: Alles auswählen

#!/bin/sh
testseq="12 30 14 43 394 2 2 18 3459 39"
testsort=$(echo "[2, 2, 12, 14, 18, 30, 39, 43, 394, 3459]" | sed -e 's/\[//' -e 's/\]//' -e 's/, / /g')
testsort2=$(echo $testseq | tr ' ' '\n' | sort -n | tr '\n' ' ')
echo $testsort
echo $testsort2
if [ "$testsort" = "$testsort2" ]; then
 echo "gleich"
else
 echo "ungleich"
fi
# Jetzt wird's merkwürdig...
testsort=$(echo $testsort   | tr ' ' 'L' | tr 'L' ' ')
testsort2=$(echo $testsort2 | tr ' ' 'L' | tr 'L' ' ')
if [ "$testsort" = "$testsort2" ]; then
 echo "gleich"
else
 echo "ungleich"
fi
liefert bei mir die Ausgabe

stefan@localhost ~/tmp $ ./cmptest.sh
2 2 12 14 18 30 39 43 394 3459
2 2 12 14 18 30 39 43 394 3459
ungleich
gleich

Wie kann das sein? Wie man anhand der Ausgabe sieht, sind die Zeichenketten bereits
vor dem ersten Vergleich gleich. Und die Anweisungen

Code: Alles auswählen

testsort=$(echo $testsort   | tr ' ' 'L' | tr 'L' ' ')
testsort2=$(echo $testsort2 | tr ' ' 'L' | tr 'L' ' ')
[\code]
bewirken ja eigentlich nicht's, trotzdem sind die Zeichenketten danach gleich.

Kann mir das bitte jemand erklären??

Danke, Stefan

PS: Hab gerade versucht ein Skript zu schreiben, was die Ausgaben zweier Programme
vergleicht, und dabie bin ich auf dieses merkwürdige verhalten gestoßen.

komsomolze
Beiträge: 430
Registriert: 03. Mär 2006 23:16

#2 Beitrag von komsomolze » 12. Mai 2006 16:36

Hallo,

ersetzt Du

Code: Alles auswählen

...
echo $testsort
echo $testsort2 
...
durch

Code: Alles auswählen

...
echo _$testsort_
echo _$testsort2_
...
dann siehst du, dass bei testsort2 noch ein angehängtes Leerzeichen im String ist.
Bei der Bearbeitung mit 'tr..tr..' verschwindet dieses durch Wiedereinlesen in die Variable,

psychodad

#3 Beitrag von psychodad » 12. Mai 2006 18:12

Danke für die Antwort

Wenn ich es mit

Code: Alles auswählen

echo {$testsort}
echo {$testsort2}
ausgebe, ist tatsächlich ein Leerzeichen mehr zu sehen. Aber wenn ich anschließend

Code: Alles auswählen

echo $(echo $testsort | tr ' ' 'L')
echo $(echo $testsort2 | tr ' ' 'L')
aufrufe, dann ersetzt er dieses Leerzeichen nicht mit einem L. Wieso, ich verstehe dieses verhalten nicht, würde es aber gerne verstehen?

PS: Mit

Code: Alles auswählen

echo _$testsort_
echo _$testsort2_ 
klappt es bei mir übrigens nicht, wahrscheinlich weil er denkt, dass testsort_ und testsort2_
Variablen sind. Wieso klappt das bei Dir? Gibt es da nicht irgendwelche Festlegungen?

stefan@localhost ~ $ sh --version
GNU bash, version 3.00.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

komsomolze
Beiträge: 430
Registriert: 03. Mär 2006 23:16

#4 Beitrag von komsomolze » 12. Mai 2006 19:12

Guten Abend,

"_": ich habe beim Versuchen mit einem "." gearbeitet, beim Posten allerdings nur an die bessere Sichtbarkeit dieses Zeichens gedacht, nicht dass es zur Variablen hinzugefügt wird. Sorry.

Code: Alles auswählen

echo $(echo $testsort2 | tr ' ' 'L') 
beim 'echo' erscheint das Zeichen, beim Pipen verschwindet es als wenn Du einfach mehrere eintippen würdest:

Code: Alles auswählen

echo $(echo $testsort2           | tr ' ' 'L') 
Das Verhalten ändert sich, wenn du quotes "" um die Variable packst:

Code: Alles auswählen

echo $(echo "$testsort2" | tr ' ' 'L') 
dann wird auch das Leerzeichen gepiped.

psychodad

#5 Beitrag von psychodad » 12. Mai 2006 19:48

Achso, alles klar, weil die Bash ja erstmal die Variable auswertet und ihren Wert einfach einsetzt als würde ich es "normal" eingetippt haben.

Dankeschön, hab's verstanden! :D

Antworten