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

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
In bash auf Integer prüfen

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



Anmeldungsdatum: 11.06.2002
Beiträge: 18

BeitragVerfasst am: 09. Jan 2003 21:35   Titel: In bash auf Integer prüfen

Hi Jungs,
wie kann ich in der bash prüfen ob eine Variable eine Integer ist?
Vielen Dank im Voraus.
hammerP
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

rattengift
Gast





BeitragVerfasst am: 09. Jan 2003 23:12   Titel: Re: In bash auf Integer prüfen

code:
VARIABLE=.....
if $(echo $VARIABLE | grep -q '^[0-9]\+$'); then
echo integer
else
echo string
fi

das suchmuster für grep beschreibt eine zeichenfolge, die ausschliesslich ziffern (aber davon mindestens eine) enthält.
"-q" unterdrückt die ausgabe von grep. stattdessen wird nur der exit status zurückgegeben.
 

Jochen
Gast





BeitragVerfasst am: 10. Jan 2003 8:53   Titel: Re: In bash auf Integer prüfen

1. Die '\+'-Notation ist eine GNU-grep-Spezialität, ebenso wie die Option '-q'; portabel wäre entweder
grep '^[0-9][0-9]*$' &>-
oder
egrep '^[0-9]+$' &>-
('&>-' ist die bash-Version von '>/dev/null 2>/dev/null', aber die bash war ja explizit erwünscht.)


2. Je nachdem, wieviele Integers zu testen sind, sollte man auf den Aufruf eines externen Kommandos wie grep verzichten, da die bash so etwas natürlich auch eingebaut hat. In der einfachsten Form wäre das
if [[ -n "$VAR" && -z "${VAR##[0-9]*}" ]] ; then ...
Will man auch auf ein optionales Vorzeichen testen, muss man erst die erweiterten Globbing-Mechanismen mittels "shopt -s extglob" aktivieren. Die Lösung wäre dann
code:
shopt -s extglob

if [[ -n "$VAR" && -z "${VAR##?([-+])+([0-9])}" ]] ; then
echo "\$VAR ist Integer: $VAR"
else
echo "\$VAR ist *nicht* Integer: $VAR"
fi

Siehe auch "man bash", Sektion "Parameter Expansion" für die ${VAR##}-Syntax, Sektion "Pattern Matching" für die ?([-+]) und +([0-9]) Syntax und Sektion "CONDITIONAL EXPRESSIONS" für die Optionen -n und -z bei [[ ]].

Jochen
 

rattengift
Gast





BeitragVerfasst am: 10. Jan 2003 14:10   Titel: Re: In bash auf Integer prüfen

Hi Jochen,

parameter expansion war auch mein erster gedanke; ich hab irrtümlicherweise angenommen, dass dort keine regexps gehen.

> portabel wäre entweder grep '^[0-9][0-9]*$' &>- oder egrep '^[0-9]+$' &>-

soll das heissen, dass egrep "portabler" ist als gnu-grep? wenn ja, dann werde ich es in zukunft öfter verwenden. ich habe es bisher immer vermieden (obwohl es schneller und mächtiger ist als grep), gerade weil ich dachte, es sei *weniger* portabel.
 

hammerp



Anmeldungsdatum: 11.06.2002
Beiträge: 18

BeitragVerfasst am: 10. Jan 2003 15:27   Titel: Re: In bash auf Integer prüfen

@Jochen:
Mir gefällt die Idee ohne grep sehr gut. Allerdings kann ich es nicht ganz nachvollziehen und es gibt auch dann true zurück, wenn der Inhalt der Variable aus Zahlen und Buchstaben besteht und das erste Zeichen eine Zahl ist, zB: 2asdf
Wie kann man das noch verbessern?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

Jochen
Gast





BeitragVerfasst am: 10. Jan 2003 17:13   Titel: Re: In bash auf Integer prüfen

> Mir gefällt die Idee ohne grep sehr gut.

So weit, so gut...

> Allerdings kann ich es nicht ganz nachvollziehen und es gibt auch dann true zurück, wenn der Inhalt der Variable aus Zahlen und Buchstaben besteht und das erste Zeichen eine Zahl ist, zB: 2asdf

... und da fangen die Probleme an. Vor allem, weil ich sie nicht nachvollziehen kann . Ich habe das Skript mittels Cut'n'Paste aus meinem Posting kopiert (um Tippfehler zu vermeiden) und um ein paar Testwerte erweitet:
code:
#!/bin/bash

shopt -s extglob

for VAR in 123 +123 -123 abc123 123abc +123abc -123abc +abc123 -abc123 ; do
if [[ -n "$VAR" && -z "${VAR##?([-+])+([0-9])}" ]] ; then
echo "\$VAR ist Integer: $VAR"
else
echo "\$VAR ist *nicht* Integer: $VAR"
fi
done


Und das Ergebnis ist eigentlich wie erwartet:

$VAR ist Integer: 123
$VAR ist Integer: +123
$VAR ist Integer: -123
$VAR ist *nicht* Integer: abc123
$VAR ist *nicht* Integer: 123abc
$VAR ist *nicht* Integer: +123abc
$VAR ist *nicht* Integer: -123abc
$VAR ist *nicht* Integer: +abc123
$VAR ist *nicht* Integer: -abc123

Man beachte vor allen die Ausgabezeilen 4,5 und 6. Daher würde ich erst mal auf einen Tappfehler Deinerseits tappen - äh, tippen und vorschlagen, auch für einen ersten Test das Beispielskript mittels Cut'n'Paste zu übernehmen. (bash-Version bei mir ist übrigens 2.0.5b.)

@rattengift: Na ja, Regexps wie bei grep, sed und Konsorten sind es ja auch nicht, aber recht nah verwandt.

Was die Portabilität betrifft, bin ich gerade ins Schleudern gekommen. Auf älteren UNIX-Maschinen ist die Trennung recht strikt; es gibt dann halt grep mit Basic RegExps und egrep mit Extended Regexps (bei SCO OpenServer 3/5, beispielsweise). Auf einer Solaris 2.6 sagte mir die man-Page aber gerade, um portabel zu bleiben, solle man "/usr/xpg4/bin/grep -E" verwenden... Tja. grep und egrep gibt es aber weiterhin, wenn ggf. auch nur als 2 Links auf ein und dasselbe Programm. Ich nehme trotzdem erst mal meine Behauptung mit der Portabilität zurück und sage nur noch, dass ich es so machen würde. Kann sein, dass die moderneren Sys5R4.2-Unixe (und höher) da auch etwas vereinheitlicht haben.

Jochen
 

odo
Gast





BeitragVerfasst am: 11. Jan 2003 9:21   Titel: Re: In bash auf Integer prüfen

Paßt gerade hierher:

Ist bei mehrfach ineinander geschachtelten if irgendwas zu beachten?
Ich bekomme dann immer ein "unexpected end of script" obwohl die if alle korrekt mit fi zu sind.

Was könnte das sein?
 

Jochen
Gast





BeitragVerfasst am: 11. Jan 2003 12:26   Titel: Re: In bash auf Integer prüfen

"if" lässt sich beliebig schachteln. Wenn Du ein "Unexpected end of script" kriegst, dann ist es meistens ein fehlendes Anführungszeichen ("), ein fehlendes Apostroph ('), ein fehlender Backtick (`), eine fehlende schliessende geschweifte oder runde Klammer oder so etwas. Klammern kannst Du im vi sehr gut checken, wenn Du den Cursor auf eine Klammer stellst und dann "%" drückst. Der Cursor springt dann auf die dazu passende Klammer oder bleibt stehen, wenn er keine mehr dazu findet. Die anderen Zeichen musst Du händisch (äugisch?) prüfen.

Jochen
 

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