http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_03.html
Sie können auch die Zeichenklassen der Bash verwenden.
if [[ $VAR = *[[:digit:]]* ]]; then
echo "$VAR is numeric"
else
echo "$VAR is not numeric"
fi
Zahlen enthalten Leerzeichen, den Dezimalpunkt und "e" oder "E" für Gleitkomma.
Wenn Sie jedoch eine Hex-Zahl im C-Stil angeben, z.B. "0xffff" oder "0XFFFF", gibt [[:digit:]] true zurück. Ein bisschen eine Falle hier, Bash können Sie etwas wie "0xAZ00" zu tun und immer noch zählen es als eine Ziffer (ist dies nicht von einigen seltsamen Eigenart der GCC-Compiler, die Sie 0x Notation für andere Basen als 16 verwenden können???)
Sie sollten auf "0x" oder "0X" testen, bevor Sie prüfen, ob es sich um eine numerische Zahl handelt, wenn Ihre Eingabe völlig unzuverlässig ist, es sei denn, Sie wollen Hex-Zahlen akzeptieren. Das würde erreicht werden durch:
if [[ ${VARIABLE:1:2} = "0x" ]] || [[ ${VARIABLE:1:2} = "0X" ]]; then echo "$VAR is not numeric"; fi
21 Stimmen
Nebenbei bemerkt - die
test && echo "foo" && exit 0 || echo "bar" && exit 1
Ansatz, den Sie verwenden, kann einige unbeabsichtigte Nebeneffekte haben -- wenn das Echo fehlschlägt (vielleicht ist die Ausgabe an einen geschlossenen FD), wird dieexit 0
wird übersprungen, und der Code wird dann versuchenecho "bar"
. Scheitert sie auch daran, wird die&&
wird fehlschlagen, und es wird nicht einmal ausgeführtexit 1
! Mit aktuellenif
Erklärungen und nicht&&
/||
ist weniger anfällig für unerwartete Nebenwirkungen.0 Stimmen
@CharlesDuffy Das ist die Art von wirklich cleverem Denken, zu dem die meisten Leute nur kommen, wenn sie haarige Bugs aufspüren müssen...! Ich hätte nie gedacht, dass Echo einen Fehler zurückgeben könnte.
13 Stimmen
Ich bin zwar etwas spät dran, aber ich weiß um die Gefahren, über die Charles geschrieben hat, da ich sie vor einiger Zeit auch durchmachen musste. Hier ist also eine 100 % narrensichere (und gut lesbare) Zeile für Sie:
[[ $1 =~ "^[0-9]+$" ]] && { echo "number"; exit 0; } || { echo "not a number"; exit 1; }
Die geschweiften Klammern zeigen an, dass die Dinge NICHT in einer Subshell ausgeführt werden sollen (was bei()
stattdessen Klammern verwenden). Vorbehalt: Niemals das letzte Semikolon vergessen . Andernfalls könnten Siebash
um die hässlichsten (und sinnlosesten) Fehlermeldungen auszugeben...9 Stimmen
In Ubuntu funktioniert es nicht, es sei denn, Sie entfernen die Anführungszeichen nicht. Es sollte also einfach sein
[[ 12345 =~ ^[0-9]+$ ]] && echo OKKK || echo NOOO
0 Stimmen
...ich habe die (fehlerhafte) Antwort aus der Frage entfernt - Antworten sollten unter anderem deshalb getrennt sein, damit sie einzeln kommentiert, abgestimmt, korrigiert usw. werden können.
8 Stimmen
Sie müssen sein spezifischer was Sie meinen mit "Nummer" . Eine ganze Zahl? Eine Festkommazahl? Wissenschaftliche ("e") Notation? Ist ein bestimmter Bereich vorgeschrieben (z. B. ein 64-Bit-Wert ohne Vorzeichen), oder ist jede Zahl zulässig, die geschrieben werden kann?
0 Stimmen
Es ist unglaublich, dass die Bash keine zuverlässige, eingebaute Möglichkeit bietet, zu überprüfen, ob ein Wert numerisch ist oder nicht. Die Anzahl, die Vielfalt und die unterschiedliche Qualität der Antworten hier zeigen, dass dies ein ernstes Problem ist.
2 Stimmen
Die Bash bietet eine zuverlässige Methode, um festzustellen, ob eine Zahl ein INTEGER ist. { VAR="asdfas" ; (( VAR )) ; echo $?; } Die Gleichung wird korrekt fehlschlagen, wenn die Antwort "0" lautet, da "0" keine ganze Zahl ist. Ich hatte vor ein paar Minuten genau das gleiche Problem und habe diesen Thread mit einer schnellen Suche gefunden. Ich hoffe, das hilft anderen. Andere Leute waren allerdings nah dran.
0 Stimmen
@Der eine Typ aus dem Film Ihr Code gibt hässliche Meldungen auf stderr aus. Zum Beispiel
((5a))
gibtbash: ((: 5a: value too great for base (error token is "5a")