Hallo liebe Liste Ich programmiere grade ein kleines Skript und habe da eine Stelle, wo ich nicht weiterkomme: if [ "$test" != [A-Z] ]; then $test="#"; fi In $test befindet sich jeweils der erste Char eines Strings (per cut ausgelesen), also A oder 4 oder %. Ich möchte nun testen, ob es sich nicht um einen Buchstaben aus A-Z handelt. Wenn es sich nicht um A-Z handelt, soll # in die Variable. Aber obiger Syntax führt nicht zum Erfolg. Hat da jemand einen Tip für mich? Dank im voraus Gruss Michael
On Sun, Apr 21, 2002 at 12:57:24 +0200, Michael Rolli wrote:
Ich programmiere grade ein kleines Skript und habe da eine Stelle, wo ich nicht weiterkomme:
if [ "$test" != [A-Z] ]; then $test="#"; fi
Persoenlich wuerde mir die Verwendung der Variablen "test" misshagen, weil "test" zugleich auch ein Befehl (shell builtin) ist. Aber das tut hier nichts zur Sache. Dein Skript will mit "!=" einen direkten Stringvergleich durchfuehren, daher funktioniert die Suche nach den Buchstaben "[A-Z]" nicht. Ausserdem gehoert vor der Zuweisung $test="#" kein Dollarzeichen, also: test="#" Probiere alternativ Folgendes aus: echo $VARIABLENNAME | grep [A-Z] > /dev/null && VARIABLENNAME="#"
Hat da jemand einen Tip für mich?
Vielleicht hilft's. Gruss Peter Blancke -- Nachtwaechter ist der Wahnsinn, weil er wacht...
Hallo, On Sun, 21 Apr 2002, Michael Rolli wrote:
From: "Peter Blancke"
Sent: Sunday, April 21, 2002 2:23 PM echo $VARIABLENNAME | grep [A-Z] > /dev/null && VARIABLENNAME="#"
Das muesste so lauten: echo $VARIABLENNAME | grep -q '^[A-Z]' && VARIABLENNAME="#" (wichtig ist dabei das '^', nicht das -q ;)
Vielen Dank, klappt bestens mit Deiner Lösung.
Kaum, denn obiges trifft zu, wenn der String _irgendwo_ einen Grossbuchstaben enthaelt, also z.B. auf 'aFoo Aber auch eine bash-interne Loesung scheint moeglich zu sein, ich hab's jetzt nicht intensiv getestet, scheint aber zu funktionieren: test "x${VARIABLENNAME##[[:upper:]]*}" = "x" && VARIABLENNAME="#" (statt [[:upper:]] kannst du auch [A-Z] nehmen, siehe dazu aber das, was Philipp dazu schrieb). Zur Erklaerung: Aus 'man bash' (nach '##' suchen. Erste Fundstelle ist schon die richtige. Drumrum steht auch sehr viel interessantes :)): ==== ${parameter##word} The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches the beginning of the value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ``#'' case) or the longest matching pattern (the ``##'' case) deleted. ==== d.h. auf (hoffentlich verstaendlichem) Deutsch: Das '[[:upper:]]*' wird expandiert, hier also zu einem Grossbuchstaben (s. Philipp's Mail bzgl. der Schwierigkeiten, was die Zeichenklassen und deren Sortierung angeht) sowie bel. viele folgende Zeichen ('*', Stichwort 'globbing'). Das Muster (also 'Grossbuchstabe und dann irgendwas) wird nun mit dem _Beginn_ des Inhalts der Variablen VARIABLENNAME verglichen, wenn es passt, dann wird alles was passt geloescht, in diesem Fall wg. dem '*' das auf alles folgende passt, alles. Die Folge ist also: Wenn das Muster passt, dann ist das Ergebnis leer. Nun steht aber vor dem ${}-Ausdruck noch ein 'x'. Wenn also alles passt, dann ist der erste String, den 'test' zu sehen bekommt ein einsames "x", ansonsten folgt nach dem x noch irgendwas anderes. Nun wird auf Gleichheit mit dem zweiten String "x" geprueft... Test (moegl. lesbar und C&P faehig geschrieben): $ for coll in "de_DE" "POSIX" "en_EN" "en_US"; do \ export LC_COLLATE="$coll"; echo -en "$LC_COLLATE:\t"; \ for s in "Foo" "FOO" "aFoFa" "FooFa" "123" "F00" "0Foo00" \ "a0FoO" "0aFooFa" "Afoo" "ä0" "Ä1" "0Ä" "ÄF" "äF"; \ do \ test "x${s##[[:upper:]]*}" = "x" && echo "$s "; \ done | sort | xargs echo -n ; echo; \ done de_DE: Ä1 ÄF Afoo F00 Foo FOO FooFa POSIX: Afoo F00 FOO Foo FooFa Ä1 ÄF en_EN: Afoo F00 FOO Foo FooFa Ä1 ÄF en_US: Ä1 ÄF Afoo F00 FOO Foo FooFa (scheint also zu klappen :)) -dnh -- "Napoleon trug immer Rot, damit seine Soldaten nicht sehen konnten, wenn er verwundet wurde. Die Nazis trugen braune Hosen..." -- unbekannt
Michael Rolli schrieb am Sonntag den 21. April 2002:
if [ "$test" != [A-Z] ]; then $test="#"; fi
Das sieht wie PerlBash aus :) if [ "$TEST" \< "A" -o "$TEST" \> "Z" ]; then TEST="#"; fi Klassen lassen sich bei test IMHO leider nicht verwenden. Gruß Jens -- GCS/IT/S d-@ s+:- a>-- C+++ UL+++ P+++ L+++ E--- W- N++ o+ K? W O- M- !V PS+ PE Y+ PGP++ t++ 5- X+ R- tv- b- DI? D+ G e* h+ r y+@
Hallo, On Sun, 21 Apr 2002, Jens Tautenhahn wrote:
Michael Rolli schrieb am Sonntag den 21. April 2002:
if [ "$test" != [A-Z] ]; then $test="#"; fi Klassen lassen sich bei test IMHO leider nicht verwenden.
Doch ;) Allerdings nicht so wie oben (siehe den anderen Subthread). -dnh -- Then when you mention the free $EXPENSIVE_STUFF you'll be getting soon, listen for the audible *click* when his brain realizes your loyalty can be bought. -- Jerry Mulligan in asr
participants (4)
-
David Haller
-
Jens Tautenhahn
-
Michael Rolli
-
Peter Blancke