Ich habe mir die Antworten angesehen und... festgestellt, dass niemand an FLOAT-Zahlen (mit Punkt) gedacht hat!
Die Verwendung von grep ist ebenfalls sehr hilfreich.
-E bedeutet erweiterte Regexp
-q bedeutet Ruhe (kein Echo)
-qE ist die Kombination aus beidem.
Zum Testen direkt in der Befehlszeile:
$ echo "32" | grep -E ^\-?[0-9]?\.?[0-9]+$
# answer is: 32
$ echo "3a2" | grep -E ^\-?[0-9]?\.?[0-9]+$
# answer is empty (false)
$ echo ".5" | grep -E ^\-?[0-9]?\.?[0-9]+$
# answer .5
$ echo "3.2" | grep -E ^\-?[0-9]?\.?[0-9]+$
# answer is 3.2
Verwendung in einem Bash-Skript:
check=`echo "$1" | grep -E ^\-?[0-9]*\.?[0-9]+$`
if [ "$check" != '' ]; then
# it IS numeric
echo "Yeap!"
else
# it is NOT numeric.
echo "nooop"
fi
Um JUST Ganzzahlen abzugleichen, verwenden Sie dies:
# change check line to:
check=`echo "$1" | grep -E ^\-?[0-9]+$`
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")