Forums Neueste Beiträge
 

expr und Gross-/Kleinschreibung

20/02/2013 - 09:37 von Jochen Luebbers | Report spam
Hallo,

ein (altes) Shell-Script, das auf meinem Rechner prima funktioniert, tut
auf dem PC eines Kollegen nicht.
Beim Nachschauen, was da passiert, kam heraus, dass "expr" der Schuldige
ist.

Ich kann das Problem auf eine Ausdruck

expr 'Test' : '[A-z]*'; echo $?

reduzieren. Bei mir liefert er das Ergebnis:
4
0
auf dem anderen PC:
0
1

Wenn ich mich allerdings via ssh auf dem PC des Kollegen anmelde,
funktionierte aber alles wieder gut! Ursache war, dass ich mit
LANG=C
unterwegs bin und mein Kollege mit
LANG=en_GB.UTF-8

Da ist die erste Frage: Warum "passt" der Ausdruck bei LANG=C, aber nicht
bei LANG=en_GB.UTF-8? Sowohl bei UTF-8 als auch bei ASCII ist der
Buchstabenbereich, der von "[A-z]" abgedeckt wird, identisch!

Ist meine Vorstellung falsch, dass deshalb das Muster auch beide Male
"passen" müsste?


Doch es wird noch seltsamer: Auf meinem Rechner liefert "expr" auch mit
der Einstellung LANG=en_GB.UTF-8 ein positives Ergebnis (4^J0).

Auf beiden Maschinen waren keine weiteren LC_<...>-Variablen gesetzt, so
dass ein "locale" immer brav den Wert von "LANG" wiederholte.

Beide Maschienen sind mit CentOS 6 installiert, einmal allerdings 32-Bit
und einmal 64-Bit (mein Rechner), und auch die Versionen der "coreutils",
aus denen "expr" stammt, unterscheiden sich minimal: 8.4-16 versus 8.4-19.

Verhàlt sich ein "expr" falsch?

Etwas ratlos
Jochen
"Who desire to give up freedom in order to gain security
will loose both in the end."
 

Lesen sie die antworten

#1 Stefan Enzinger
20/02/2013 - 15:20 | Warnen spam
On 2013-02-20 09:37, Jochen Luebbers wrote:
Hallo,

ein (altes) Shell-Script, das auf meinem Rechner prima funktioniert, tut
auf dem PC eines Kollegen nicht.
Beim Nachschauen, was da passiert, kam heraus, dass "expr" der Schuldige
ist.

Ich kann das Problem auf eine Ausdruck

expr 'Test' : '[A-z]*'; echo $?



Auf [A-z] kann man sich außerhalb von LANG=C einfach nicht verlassen,
wie mir hier kürzlich auch klar wurde.

Nimm einfach:
expr 'Test' : '[[:alpha:]]*'; echo $?

und es passt :)

Ähnliche fragen