Wie verhindere ich, dass Bash Oktalcode anstelle von Ganzzahlen interpretiert?

13

Ich schreibe ein Horoskop-RSS-Skript als Einführung in ein Unix / Linux-Projekt und bin auf ein Problem gestoßen, das mein Professor in der Zeit, in der ich nach dem Unterricht bleiben konnte, nicht beheben konnte. Da ich nicht herausfinden konnte, wie man tatsächliche Daten als zu überprüfende Daten verwendet, dachte ich, ich würde eine Grundrechenart ausprobieren, indem die Benutzereingabe Standardzahlen im MMDD-Format sein sollte. Ihm zufolge scheint das Skript die Eingabe als Oktalcode statt als Ganzzahl zu lesen. Hier ist ein Beispiel des Skripts:

    elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit

Das sind die nackten Knochen, ich habe den RSS-Teil rausgenommen. "olddate" ist die erwartete Eingabe von meiner Leseaufforderung. Während 1121 bis 1131, 1200 bis 1222 und 0100 bis 0120 arbeiten, funktioniert nichts zwischen 1221 bis 1232. Er vermutete, dass dies das Problem war, da das Setzen von 113 ohne führende 0 für Capricorn funktionierte. Ich bin auch gerade auf ein Problem gestoßen, bei dem 0323, das mir Widder geben sollte (-gt 0320 && -lt 0332), mir Wassermann gab (dessen Daten -gt 0119 && -lt 0132 || -gt 0200 && -lt 0219) als und 0417 funktioniert nicht (das ist der andere Datumsbereich für Widder, -gt 0400 && -lt 0420).

Was mache ich, damit BASH Eingaben als tatsächliche Zahlen interpretiert? Er versuchte, die Leseaufforderung zu ändern, um "userdate" als Eingabe zu erwarten, und fügte dann hinzu

olddate=`printf '%d\n' "$userdate"`

aber das hat nicht funktioniert. Vielen Dank im Voraus an alle, die mir dabei helfen können!

Irre Levant
quelle
Kann in der Bash nicht dupliziert werden 4.4.12.
Ignacio Vazquez-Abrams
1
$ olddate ist eine Zeichenfolge, keine Zahl. Verwenden Sie also Zeichenfolgenvergleiche, und vermeiden Sie das ganze Durcheinander.
Stephen Harris
2
@StephenHarris: Dies gilt auch für die Werte rechts von den Operatoren. Deshalb testhat explizite numerische Operatoren.
Ignacio Vazquez-Abrams
Eine Sache, die zu beachten ist, aber nichts mit der Kernfrage zu tun hat, ist, dass Ihr Sternzeichen auch teilweise von dem Jahr abhängt, in dem Sie geboren wurden, wenn Ihr Tag und Ihr Geburtsmonat nahe am Übergang zwischen zwei Sternzeichen lagen. Ihr Sternzeichen basiert auf dem 1/12-Teil des Himmels, in dem sich die Sonne zum Zeitpunkt Ihrer Geburt befand. Da die Anzahl der Tage in einem Jahr jedoch weder ganzzahlig noch durch 12 teilbar ist, gibt es Abweichungen von Jahr für Jahr. Diese Variante ist zu komplex, um sie wirklich in If-else-Bäumen zu erfassen, aber es ist nur etwas, was man wissen sollte.
Nzall

Antworten:

28

Sie können die Umwandlung einer Zahl in eine bestimmte Basis in Bash erzwingen, wie folgt:

$ foo=400
$ echo $((8#$foo))
256
$ bar=0100
$ echo $((10#$bar))
100

Im Allgemeinen ist das Format $((base#value)).

Ignacio Vazquez-Abrams
quelle