Dies kann erreicht werden durch die Verwendung von grep
um festzustellen, ob die betreffende Variable mit einem erweiterten regulären Ausdruck übereinstimmt.
Test Ganzzahl 1120
:
yournumber=1120
if echo "$yournumber" | grep -qE '^[0-9]+$'; then
echo "Valid number."
else
echo "Error: not a number."
fi
Ausgabe: Valid number.
Test nicht-ganzzahlig 1120a
:
yournumber=1120a
if echo "$yournumber" | grep -qE '^[0-9]+$'; then
echo "Valid number."
else
echo "Error: not a number."
fi
Ausgabe: Error: not a number.
Erläuterung
- Le site
grep
die -E
erlaubt uns die Verwendung von erweiterten regulären Ausdrücken '^[0-9]+$'
. Dieser reguläre Ausdruck bedeutet, dass die Variable nur []
enthalten die Zahlen 0-9
null bis neun aus dem ^
Anfang zum $
Ende der Variable und sollte mindestens +
ein Zeichen.
- Le site
grep
die -q
Der Quiet-Schalter schaltet alle Ausgaben aus, unabhängig davon, ob er etwas findet oder nicht.
if
prüft den Exit-Status von grep
. Status "Beenden 0
bedeutet Erfolg, alles darüber hinaus bedeutet einen Fehler. Die Website grep
hat einen Exit-Status von 0
wenn es eine Übereinstimmung findet und 1
wenn es nicht der Fall ist;
Zusammenfassend lässt sich also sagen, dass in der if
Test, wir echo
die Variable $yournumber
y |
leiten Sie es an grep
die mit dem -q
Schalter entspricht stillschweigend dem -E
erweiterter regulärer Ausdruck '^[0-9]+$'
Ausdruck. Der Exit-Status von grep
wird sein 0
wenn grep
erfolgreich eine Übereinstimmung gefunden und 1
wenn es nicht so wäre. Wenn es gelingt, übereinzustimmen, werden wir echo "Valid number."
. Wenn es nicht übereinstimmt, werden wir echo "Error: not a number."
.
Für Schwimmer oder Doppelgänger
Wir können den regulären Ausdruck einfach von '^[0-9]+$'
a '^[0-9]*\.?[0-9]+$'
für Floats oder Doppelgänger.
Test Schwimmer 1120.01
:
yournumber=1120.01
if echo "$yournumber" | grep -qE '^[0-9]*\.?[0-9]+$'; then
echo "Valid number."
else
echo "Error: not a number."
fi
Ausgabe: Valid number.
Test Schwimmer 11.20.01
:
yournumber=11.20.01
if echo "$yournumber" | grep -qE '^[0-9]*\.?[0-9]+$'; then
echo "Valid number."
else
echo "Error: not a number."
fi
Ausgabe: Error: not a number.
Für Negative
Um negative ganze Zahlen zuzulassen, ändern Sie einfach den regulären Ausdruck von '^[0-9]+$'
a '^\-?[0-9]+$'
.
Um negative Floats oder Doubles zuzulassen, ändern Sie einfach den regulären Ausdruck von '^[0-9]*\.?[0-9]+$'
a '^\-?[0-9]*\.?[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")