Ich versuche, etwas häufig genug zu tun: Benutzereingaben in einem Shell-Skript analysieren. Wenn der Benutzer eine gültige Ganzzahl angegeben hat, führt das Skript eine Sache aus, und wenn es nicht gültig ist, führt es etwas anderes aus. Das Problem ist, ich habe keinen einfachen (und einigermaßen eleganten) Weg gefunden, dies zu tun - ich möchte es nicht char für char auseinander nehmen müssen.
Ich weiß, dass das einfach sein muss, aber ich weiß nicht wie. Ich könnte es in einem Dutzend Sprachen machen, aber nicht BASH!
In meiner Forschung fand ich Folgendes:
Und darin gibt es eine Antwort, die über Regex spricht, aber soweit ich weiß, ist dies eine Funktion, die (unter anderem) in C verfügbar ist. Trotzdem hatte es eine großartige Antwort, also versuchte ich es mit grep, aber grep wusste nicht, was ich damit anfangen sollte. Ich habe -P ausprobiert, was auf meiner Box bedeutet, es als PERL-Regexp-Nada zu behandeln. Dash E (-E) hat auch nicht funktioniert. Und -F auch nicht -F.
Um ganz klar zu sein, ich versuche so etwas und suche nach einer Ausgabe - von dort aus werde ich das Skript hacken, um alles zu nutzen, was ich bekomme. (IOW, ich hatte erwartet, dass eine nicht konforme Eingabe nichts zurückgibt, während eine gültige Zeile wiederholt wird.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Würde jemand bitte veranschaulichen, wie dies am einfachsten gemacht werden kann?
Ehrlich gesagt ist dies meiner Meinung nach ein Mangel an TEST. Es sollte eine Flagge wie diese haben
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
ist alt kompatibeltest
;[[
ist Bashs neue Sache, mit mehr Operationen und anderen Angebotsregeln. Wenn Sie sich bereits entschieden haben, bei Bash zu bleiben, entscheiden Sie sich für[[
(es ist wirklich viel schöner); Wenn Sie eine Portabilität auf andere Shells benötigen, vermeiden Sie dies[[
vollständig.