zuweisen eines ausdrucks x= $1 != [0-9]*

N

Nano

Foren As
Hi, leider habe ich foglendes problem ich würde gerne einen ausdruck
z.b $1 != [0-9]*
einer variablen zuweisen und zwar das ergebnis also in diesem fall ein "ture" oder "false" leider konnte ich dazu nichts finden, wohl weil ich nicht genau weiss nach was ich suche,...
klammer habe ich versucht leider ohne erfolg
x='$1 != [0-9]*' bringt $1 != [0-9]*
als ergebnis
x="$1 != [0-9]*" bringt wertderzahl != [0-9]*
( und{ und [ brachten leider auch keinen erfolg
 
woah, entscheide dich mal für'ne sprache.
Code:
$1 != [0-9]*
in welcher sprache funktioniert das denn bitte so?
ist
Code:
[0-9]*
eine regex?

also die bash kann sogar einigermaßen mit regexes umgehen, aber generell für "abfragen" schau dir erstmal
Code:
man test
an. das ding gibt als rückgabewert "0" für true und ungleich null für false. (also genau umgekehrt wie in "klassischen" sprachen...)
lies dir mal'n paar bash tutorials durch... (gibts viele gute von, google ist dein freund)
du arbeitest in einem skript und "$1" ist dein erster parameter, richtig? btw: die single-quotes (') verhindern die variablen-expansion (nur so nebenbei)...
aber hier, wenn du schaun willst, ob die regex [0-9]* in einer variable bla matcht, machst du einfach:
Code:
if [[ $bla =~ [0-9]* ]]; then echo 'lolol'; fi
wobei die regex "[0-9]*" IMMER matchen wird....
regex tutorials gibts auch viele im netz...
ganz informative seite zu regexes
 
ok nochmal von vorne war vielleicht etwas unglücklich formuliert,
ich habe ein statement das bei auswertung true oder false ergibt
also $zahl != [0-9]*
würde true ergeben wenn $zahl z.b ein "a" wäre
und dieses ergebnis würde ich gerne in eine variable speichern
also in der form

VARIABLE = $zahl != [0-9]*

wobei $zahl != [0-9]* noch irgendwie berechnet geklammert oder was auch immer werden muss damit es der VARIABLE zugewiesen werden kann ( als true oder false )
 
und dieses ergebnis würde ich gerne in eine variable speichern
und warum genau? reicht eine normale if-verzweigung nicht aus?
und afaik geht das nicht ohne weiteres. der "standard" weg für kausale verzweigungen/tests ist, wie bereits erwähnt das programm test.

das bash-builtin mit "[[ bla =~ zomg ]]" liefert AFAIK keinen rückgabewert zurück, den man in einer variable speichern kann, sondern ist direkt in verbindung mit einem if-statement zu verwenden.

mit test könnte man sowas krüppeliges konstruieren:
Code:
test $(echo "$bla" | egrep '[0-9]*')
var=$?
$? ist der rückgabewert des letzten programmes. wenn "test" erfolgreich war, gibt es 0 zurück, wenn nicht, etwas ungleich 0. (wahrscheinlich 1 oder so...)
und die erste zeile testet, ob der string, den das kommando "echo $bla | egrep '[0-9]*'" zurückgibt nicht leer ist. also quasi ob die regex gematcht hat. wobei deine regex auch in leeren strings matcht, von daher....
 
und warum genau? reicht eine normale if-verzweigung nicht aus?
und afaik geht das nicht ohne weiteres. der "standard" weg für kausale verzweigungen/tests ist, wie bereits erwähnt das programm test.

kein spezieler grund wollte was versuchen und hab dabei festgestellt das ich das so nicht zuweisen kann und würde gerne wissen warum .
Ich kenn es nur aus anderen Programmiersprachen das eben diese a != b teil im prinzip durch true oder false zu ersetzen ist , klar kann man das anders umgehen aber ich gehe bzw ging fest davon aus das es möglich ist und nur ein paar klammern fehlen
wobei deine regex auch in leeren strings matcht, von daher....

nein doch nur strings die mit einer zahl beginnen
 
Hallo
Von welcher Shell redest du?

Bash:
true = 0;
false > 0;
Willst du eine var testen, kannst du das direkt oder über den Rückgabewert von test machen.

e.g.
Code:
a=123456;
b=12A456;
test -z ${a//[0-9]/};   # alle Ziffern raus!
FLAG=$?; 
echo $FLAG;
0
test -z ${b//[0-9]/};   # alle Ziffern raus!
FLAG=$?; 
echo $FLAG;
1

oder direkt:
Code:
if [ -z ${a//[0-9]/} ]; 
then
echo Nur Ziffern;
FLAG=0;
else
echo "Error not only digit";
FLAG=1;
fi

Ups schon jemand vor mir feddisch. ;)
Macht nix trotzdem meine Variante für die Bash.

Gruß Wolfgang
 
nein doch nur strings die mit einer zahl beginnen
nö, strings in denen die character-class [0-9] null bis (theoretisch) unendlich oft vorkommt...
wenn sie mindestens einmal vorkommen soll/muss, nimm + statt *
 
also ich weiss nicht warum aber

Code:
if [[ $1 != [0-9]* ]]
then
echo "keine natürliche zahl"
fi

geht aber

Code:
if [[ $1 != [0-9]+ ]]
then
echo "keine natürliche zahl"
fi

geht nicht und es wird "keine natürliche zahl" ausgegeben
beide versionen selbstverständlich mit der selben zahl getestet..

auch funktionieren die beispiele aus dem tutorial wie z.b "^[0-9]$" für nur ein zahl nicht, hat jemand eine ahnung woran das liegt ?
als shell nutze ich bash unter solaris
 
man re_syntax

* a sequence of 0 or more matches of the atom

+ a sequence of 1 or more matches of the atom

Gruß Aqualung
 
das ist mir bewusst aqualung aber es geht halt nicht wenn ich das skript in dem nur obiger code steht mit "skriptname zahl" starte bekomm ich im 2ten fall die meldung ...
was ja nicht sein dürfte da ich ja eine zahl angebe
 
das liegt daran, dass das hier:
Code:
if [[ $bla != [0-9]* ]]
überhaupt keine regex ist, sondern einfach nur ein bash pattern matching whatever. also normale wildcards (* und ?) und character classes, die jedoch per default genau einmal matchen...
man bash schrieb:
Pattern Matching

Any character that appears in a pattern, other than the special pattern characters described below, matches itself. The NUL character may not occur in a pattern. A backslash escapes the following character; the escaping backslash is discarded when matching. The special pattern characters must be quoted if they are to be matched literally. The special pattern characters have the following meanings:

* Matches any string, including the null string.
? Matches any single character.
[...] Matches any one of the enclosed characters. A pair of characters separated by a hyphen denotes a range expression; any character that sorts between those two characters, inclusive, using the current locale’s collating sequence and character set, is matched. If the first character following the [ is a ! or a ^ then any character not enclosed is matched. The sorting order of characters in range expressions is determined by the current locale and the value of the LC_COLLATE shell variable, if set. A - may be matched by including it as the first or last character in the set. A ] may be matched by including it as the first character in the set.

Within [ and ], character classes can be specified using the syntax [:class:], where class is one of the following classes defined in the POSIX standard:
alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit A character class matches any character belonging to that class. The word character class matches letters, digits, and the character _.

was quasi auf meine zweite frage in diesem thread zurück führt:
ich schrieb:
ist
Code:
[0-9]*
eine regex?
nun haben wir die antwort: nein, es ist keine regex...
 
Zuletzt bearbeitet:
hm mag sein das ich dich dann falsch verstanden habe ich will die parameter die beim starten des script übergeben werden überprüfen , in diesem einfachen beispiel halt einfach ob es eine positive natürliche zahl ist, worin beste dann der unterschied wenn es kein regex ist ?
 
Du kannst eine regexp z.B. mit grep verwenden, ein bash pattern-globbing eben mit der bash.

Gruß Aqualung
 
Du kannst eine regexp z.B. mit grep verwenden, ein bash pattern-globbing eben mit der bash.
if [[ $this_is =~ true ]]; then i_will_eat='a besenstiel'; fi #n

also mit dem fantastischen "=~" operator kann bash auch extended regexes. \o/

und @ threadersteller: ich hab dir'n link zu'ner informativen seite über regexes gegeben und die relevante stelle aus "man bash" zu diesem pattern matching (globbing?) schwurbel auch. entscheide dich für eins und freue dir.
 
das ist nett, es geht wiegesagt um das überprüfen von übergebnen parametern sofern das mit regexes funktioniert wäre mir das am liebsten da sie scheinbar genauer zu definieren sind , allerdings habe ich bis jetzt noch keinen weg gefunden wie ich grep auf eine variable loslassen kann
 
erstmal: wie gesagt musst du noch nicht einmal mit grep arbeiten, da die bash extended regexes auch "von sich aus" kann.

Code:
bla=23
blub='ein string'
i="$bla"
if [[ $i =~ ^[1-9][0-9]*$ ]]; then echo "$i ist eine positive natürliche Zahl"; fi
i="$blub"
if [[ $i =~ ^[1-9][0-9]*$ ]]; then echo "$i ist eine positive natürliche Zahl"; fi
die regex matcht den anfang des strings (^), dann eine zahl von 1-9 (sprich nullen am anfang sind nicht erlaubt...) und dann null bis unendlich oft die character class mit 0-9, also nach der ersten ziffer die keine null sein darf sind alle ziffern erlaubt. danach matche ich noch das ende des strings mit, damit sowas wie "927Bla" zum beispiel nicht gematcht wird...

mit egrep würde man das so machen:
Code:
bla=23
blub='ein string'
i="$bla"
if [ $(echo $i | egrep '^[1-9][0-9]*$') ]; then echo "$i ist eine positive natürliche Zahl"; fi
i="$blub"
if [ $(echo $i | egrep '^[1-9][0-9]*$') ]; then echo "$i ist eine positive natürliche Zahl"; fi
erklärung:
diese konstruktion hier $(kommando bla) gibt den wert des kommandos "bla" zurück. zum beispiel, wollte ich eine variable mit "hihi" füllen, könnte ich das so über das "echo" kommando machen:
Code:
variable=$(echo 'hihi')

und zur if-syntax:
Code:
if [ bla ]
heißt nichts anderes als
Code:
if test bla
aber das erste ließt sich schöner. es ist also nur eine hübsche verpackung für das programm test wenn man so will. und wenn man test einfach mit einem string aufruft, testet test (:s) per default ob dieser string ungleich null ist. (also nicht leer ist)
da das grep kommando entweder den ganzen string oder gar nichts matcht (bedenke: ich habe den beginn und das ende des strings mitgematcht), ist der string leer, wenn die regex nicht gematcht hat...
meh :/

eine sache noch zu bedenken: beachte das quoting: die regex im bash builtin ( [[ bla =~ ^[1-9][0-9]*$ ) ist nicht gequotet. das durfte (/musste?) man in irgendeiner früheren bash-version mal, inzwischen MUSST du die quotes völlig weglassen. (respektive das kommt auf deine bash version an, aber ohne quoting sollte nichts schiefgehen...), sonst wird das ding als string und nicht als regex interpretiert...
während du hier also nicht quoten darfst, musst du beim egrep befehl quotes verwenden, um die bash daran zu hindern meta-zeichen wie den asterisken zu interpretieren (*). hier sind double quotes wie auch single-quotes erlaubt; wobei bei double-quotes variablen noch von der shell expandiert werden.
Code:
bla='hihi'
echo "$bla" # ausgabe: hihi
echo '$bla' # ausgabe: $bla
soar, das war erst mal alles von meiner seite... ://
 
vielen lieben dank das funktioniert...
mein fehler an dem ich seit einigen stunden verzweifle war wohl das ich das ~ hinter dem = nicht hatte damit gingen keine regex sondern nur die pattern

haleluja!!
 
btw kleine anmerkung:
im neuen thread zum thema (://) hast du folgendes geschrieben:
Code:
echo $x | grep "^[0-9]+$"
wenn du da einfach aus grep ein egrep gemacht hättest, hätte das schon gereicht...

naja, i'm finally out. und btw word @ bytepool: gewöhn dir mal satzzeichen an :/
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

[PHP] Autologin-Funktion

Variable mittels regex überprüfen

Samba Ordner&Rechte struktur Hilfe!

Problem mit Apache2 + MySQL Server

Zurück
Oben