Wie überprüfe ich, ob eine Variable in der UNIX-Shell eine Zahl ist oder eine Zahl enthält?
if echo $var | egrep -q '^[0-9]+$'; then
# $var is a number
else
# $var is not a number
fi
Shell-Variablen haben keinen Typ. Am einfachsten ist es, den Rückgabetyp test
zu verwenden:
if [ $var -eq $var 2> /dev/null ]; then ...
(Oder parse es mit einem Regexp)
Keine Gabeln, keine Pfeifen. Reine POSIX-Shell:
case $var in
(*[!0-9]*|'') echo not a number;;
(*) echo a number;;
esac
(Nimmt an number: = eine Zeichenfolge ). Wenn Sie signierte Nummern mit einem einzigen führenden -
oder +
zulassen möchten, entfernen Sie das optionale Zeichen folgendermaßen
case ${var#[-+]} in
(*[!0-9]*|'') echo not a number;;
(*) echo a number;;
esac
Entweder in ksh93 oder bash mit aktivierter extglob-Option:
if [[ $var == +([0-9]) ]]; then ...
Ich bin eine Art Newbee bei der Shell-Programmierung, also versuche ich, am einfachsten und lesbarsten herauszufinden nicht was auch immer ...:
if [ $var -ge 0 2>/dev/null ] ; then ...
Hier ist eine Version, die nur die in einer Bare-Bones-Shell verfügbaren Funktionen verwendet (dh sie würde in sh
funktionieren) und mit einem Prozess weniger als grep
:
if expr "$var" : '[0-9][0-9]*$'>/dev/null; then
echo yes
else
echo no
fi
Dies prüft, ob der $var
only eine ganze Zahl darstellt. Passen Sie den regulären Ausdruck an, und beachten Sie, dass das Argument expr
regexp am Anfang implizit verankert ist.
if echo "$var" | egrep -q '^\-?[0-9]+$'; then
echo "$var is an integer"
else
echo "$var is not an integer"
fi
Tests (mit var = 2 usw.):
2 is an integer
-2 is an integer
2.5 is not an integer
2b is not an integer
if echo "$var" | egrep -q '^\-?[0-9]*\.?[0-9]+$'; then
echo "$var is a number"
else
echo "$var is not a number"
fi
Tests (mit var = 2 usw.):
2 is a number
-2 is a number
-2.6 is a number
-2.c6 is not a number
2. is not a number
2.0 is a number
Dies kann mit einem regulären Ausdruck überprüft werden.
###
echo $var|egrep '^[0-9]+$'
if [ $? -eq 0 ]; then
echo "$var is a number"
else
echo "$var is not a number"
fi
Sie können dies mit einem einfachen Testbefehl tun.
$ test ab -eq 1 >/dev/null 2>&1
$ echo $?
2
$ test 21 -eq 1 >/dev/null 2>&1
$ echo $?
1
$ test 1 -eq 1 >/dev/null 2>&1
$ echo $?
0
Wenn der Exit-Status entweder 0 oder 1 ist, ist es eine ganze Zahl, aber wenn der Exis-Status 2 ist, ist es keine Zahl.
Den Wert aus der Befehlszeile übernehmen und THE INPUT IS DECIMAL/NON-DECIMAL und NUMBER oder NUMMER anzeigen:
NUMBER=$1
IsDecimal=`echo "$NUMBER" | grep "\."`
if [ -n "$IsDecimal" ]
then
echo "$NUMBER is Decimal"
var1=`echo "$NUMBER" | cut -d"." -f1`
var2=`echo "$NUMBER" | cut -d"." -f2`
Digit1=`echo "$var1" | egrep '^-[0-9]+$'`
Digit2=`echo "$var1" | egrep '^[0-9]+$'`
Digit3=`echo "$var2" | egrep '^[0-9]+$'`
if [ -n "$Digit1" ] && [ -n "$Digit3" ]
then
echo "$NUMBER is a number"
Elif [ -n "$Digit2" ] && [ -n "$Digit3" ]
then
echo "$NUMBER is a number"
else
echo "$NUMBER is not a number"
fi
else
echo "$NUMBER is not Decimal"
Digit1=`echo "$NUMBER" | egrep '^-[0-9]+$'`
Digit2=`echo "$NUMBER" | egrep '^[0-9]+$'`
if [ -n "$Digit1" ] || [ -n "$Digit2" ]; then
echo "$NUMBER is a number"
else
echo "$NUMBER is not a number"
fi
fi
Hier ist der Test ohne reguläre Ausdrücke (tcsh-Code):
Erstellen Sie eine Datei-Prüfnummer:
if ( "$*" == "0" ) then
exit 0 # number
else
((echo "$*" | bc) > /tmp/tmp.txt) >& /dev/null
set tmp = `cat /tmp/tmp.txt`
rm -f /tmp/tmp/txt
if ( "$tmp" == "" || $tmp == 0 ) then
exit 1 # not a number
else
exit 0 # number
endif
endif
und Renn
chmod +x checknumber
Benutzen
checknumber -3.45
und Sie erhalten das Ergebnis als errorlevel ($?).
Sie können es leicht optimieren.
if echo $var | egrep -q '^[0-9]+$'
Eigentlich funktioniert das nicht, wenn var mehrzeilig ist.
dh
var="123
qwer"
Besonders wenn var aus einer Datei stammt:
var=`cat var.txt`
Das ist das einfachste:
if [ "$var" -eq "$var" ] 2> /dev/null
then echo yes
else echo no
fi
( test ! -z $num && test $num -eq $num 2> /dev/null ) && {
# $num is a number
}