GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie teste ich, ob eine Variable in Bash eine Zahl ist?

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 zu true 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 (?*-* / *.*.* )


Linux
  1. Wie man einen Knall wiederholt!?

  2. Wie liest man eine Zeichenfolge als Hex-Zahl in Bash?

  3. So echoen Sie eine neue Zeile in Bash-Shell-Skripten

  4. Ich möchte alle Befehlszeilenargumente für ein Bash-Skript in einer einzigen Variablen speichern

  5. BASH:Wie man mit Zahlen in einer Pipe arithmetisch rechnet

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

Bash-Exportvariable

Bash printf - So drucken Sie eine Variable in Bash

So verwenden Sie Bash-Dateitestoperatoren in Linux

So verwenden Sie den Echo-Befehl in Bash-Skripten unter Linux

So setzen Sie die Umgebungsvariable in Bash