Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
BASH; Merkwürdiges Verhalten bei Zeichenkettenvergleich

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
psychodad
Gast





BeitragVerfasst am: 12. Mai 2006 15:54   Titel: BASH; Merkwürdiges Verhalten bei Zeichenkettenvergleich

Hallo,

folgendes Shell-Skript
Code:

#!/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]
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



Anmeldungsdatum: 03.03.2006
Beiträge: 429

BeitragVerfasst am: 12. Mai 2006 16:36   Titel:

Hallo,

ersetzt Du
Code:
...
echo $testsort
echo $testsort2
...
durch
Code:
...
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,
 
Benutzer-Profile anzeigen Private Nachricht senden

psychodad
Gast





BeitragVerfasst am: 12. Mai 2006 18:12   Titel:

Danke für die Antwort

Wenn ich es mit
Code:

echo {$testsort}
echo {$testsort2}

ausgebe, ist tatsächlich ein Leerzeichen mehr zu sehen. Aber wenn ich anschließend
Code:

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:

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



Anmeldungsdatum: 03.03.2006
Beiträge: 429

BeitragVerfasst am: 12. Mai 2006 19:12   Titel:

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:
echo $(echo $testsort2 | tr ' ' 'L')
beim 'echo' erscheint das Zeichen, beim Pipen verschwindet es als wenn Du einfach mehrere eintippen würdest:
Code:
echo $(echo $testsort2           | tr ' ' 'L')

Das Verhalten ändert sich, wenn du quotes "" um die Variable packst:
Code:
echo $(echo "$testsort2" | tr ' ' 'L')
dann wird auch das Leerzeichen gepiped.
 
Benutzer-Profile anzeigen Private Nachricht senden

psychodad
Gast





BeitragVerfasst am: 12. Mai 2006 19:48   Titel:

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! Very Happy
 

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy