Ein Ansatz ist die Verwendung eines regulären Ausdrucks wie folgt:
re='^[0-9]+$'
if ! [[ $yournumber =~ $re ]] ; then
echo "error: Not a number" >&2; exit 1
fi
Wenn der Wert nicht unbedingt eine Ganzzahl ist, sollten Sie die Regex entsprechend ändern. zum Beispiel:
^[0-9]+([.][0-9]+)?$
...oder, um Zahlen mit Vorzeichen zu handhaben:
^[+-]?[0-9]+([.][0-9]+)?$
Niemand schlug den erweiterten Musterabgleich von bash vor:
[[ $1 == ?(-)+([0-9]) ]] && echo "$1 is an integer"
oder mit einer POSIX-Zeichenklasse:
[[ $1 == ?(-)+([[:digit:]]) ]] && echo "$1 is an integer"
Die folgende Lösung kann auch in einfachen Shells wie Bourne verwendet werden, ohne dass reguläre Ausdrücke erforderlich sind. Grundsätzlich führen alle numerischen Wertauswertungsoperationen, die keine Zahlen verwenden, zu einem Fehler, der in der Shell implizit als falsch betrachtet wird:
"$var" -eq "$var"
wie in:
#!/bin/bash
var=a
if [ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null; then
echo number
else
echo not a number
fi
Sie können auch für $ testen? der Rückkehrcode der Operation, der expliziter ist:
[ -n "$var" ] && [ "$var" -eq "$var" ] 2>/dev/null
if [ $? -ne 0 ]; then
echo $var is not number
fi
Die Umleitung des Standardfehlers dient dazu, die Meldung "Integer-Ausdruck erwartet" zu verbergen, die Bash ausgibt, falls wir keine Zahl haben.
HINWEISE (Dank an die Kommentare unten):
- Zahlen mit Dezimalpunkt sind nicht als gültige "Nummern" identifiziert
- Mit
[[ ]]
statt[ ]
wird immer zutrue
ausgewertet - Die meisten Nicht-Bash-Shells werten diesen Ausdruck immer als
true
aus - Das Verhalten in Bash ist undokumentiert und kann sich daher ohne Vorwarnung ändern
- Wenn der Wert Leerzeichen nach der Zahl enthält (z. B. "1 a"), wird ein Fehler wie
bash: [[: 1 a: syntax error in expression (error token is "a")
erzeugt - Wenn der Wert derselbe wie var-name ist (z. B. i="i"), wird ein Fehler wie
bash: [[: i: expression recursion level exceeded (error token is "i")
erzeugt
Ohne Bashismen (funktioniert sogar im System V sh),
case $string in
''|*[!0-9]*) echo bad ;;
*) echo good ;;
esac
Dies verwirft leere Zeichenketten und Zeichenketten, die keine Ziffern enthalten, und akzeptiert alles andere.
Negative oder Fließkommazahlen erfordern etwas zusätzliche Arbeit. Eine Idee ist, -
auszuschließen / .
im ersten "schlechten" Muster und fügen Sie weitere "schlechte" Muster hinzu, die deren unangemessene Verwendung enthalten (?*-*
/ *.*.*
)