it-swarm.com.de

Überprüfen, ob eine Eingabenummer eine Ganzzahl ist

Ich versuche zu überprüfen, ob eine Eingabe eine Ganzzahl ist, und habe sie hundert Mal durchgesehen, sehe aber den Fehler darin nicht. Leider funktioniert es nicht, es löst die if-Anweisung für alle Eingaben (Zahlen/Buchstaben) aus.

read scale
if ! [[ "$scale" =~ "^[0-9]+$" ]]
        then
            echo "Sorry integers only"
fi

Ich habe mit den Zitaten herumgespielt, sie aber entweder verpasst oder nichts getan. Was mache ich falsch? Gibt es eine einfachere Möglichkeit zu testen, ob eine Eingabe nur ein INTEGER ist?

37
lonewarrior556

Anführungszeichen entfernen

if ! [[ "$scale" =~ ^[0-9]+$ ]]
    then
        echo "Sorry integers only"
fi
33
jimmij

Verwenden -eq Operator von test Befehl:

read scale
if ! [ "$scale" -eq "$scale" ] 2> /dev/null
then
    echo "Sorry integers only"
fi

Es funktioniert nicht nur in bash, sondern auch in jeder POSIX-Shell. Von POSIX Test Dokumentation:

n1 -eq  n2
    True if the integers n1 and n2 are algebraically equal; otherwise, false.
19
cuonglm

Da das OP nur positive ganze Zahlen zu wollen scheint:

[ "$1" -ge 0 ] 2>/dev/null

Beispiele:

$ is_positive_int(){ [ "$1" -ge 0 ] 2>/dev/null && echo YES || echo no; }
$ is_positive_int Word
no
$ is_positive_int 2.1
no
$ is_positive_int -3
no
$ is_positive_int 42
YES

Beachten Sie, dass ein einzelner [ - Test erforderlich ist:

$ [[ "Word" -eq 0 ]] && echo Word equals zero || echo nope
Word equals zero
$ [ "Word" -eq 0 ] && echo Word equals zero || echo nope
-bash: [: Word: integer expression expected
nope

Dies liegt daran, dass bei [[ Eine Dereferenzierung auftritt:

$ Word=other
$ other=3                                                                                                                                                                                  
$ [[ $Word -eq 3 ]] && echo Word equals other equals 3
Word equals other equals 3
8
Tom Hale

Für vorzeichenlose Ganzzahlen verwende ich:

read -r scale
[ -z "${scale//[0-9]}" ] && [ -n "$scale" ] || echo "Sorry integers only"

Tests:

$ ./test.sh
7
$ ./test.sh
   777
$ ./test.sh
a
Sorry integers only
$ ./test.sh
""
Sorry integers only
$ ./test.sh

Sorry integers only
8
raciasolvo
( scale=${scale##*[!0-9]*}
: ${scale:?input must be an integer}
) || exit

Das macht die Prüfung und gibt Ihren Fehler aus.

3
mikeserv

Bitte überprüfen Sie Wie teste ich, ob eine Variable eine Zahl in Bash ist Stackoverflow-Seite. Diese Seite bietet einige andere gute Möglichkeiten zum Überprüfen der Ganzzahl.

2
Reza Harasani

Eine POSIX- und tragbare Lösung ist:

read scale
if     [ -z "${scale##*[!0-9]*}" ]; 
then   echo "Sorry integers only"
fi
0
Isaac