2013-04-23 11 views
5

Das Problem ist mit den Nummern 08 und 09. Ich habe dies gegoogelt und herausgefunden, der Grund, 08 und 09 sind problematisch, aber keine Lösung.Inkrementieren einer Zahl und Hinzufügen einer führenden Null in Bash

Dies ist ein unsinniges Beispiel, das verwendet wird, um mein Problem kurz zu beschreiben, ohne auf die Details einzugehen.

cursorDay=2; 
let cursorDay=$cursorDay+1; 

case "$cursorDay" in 

1) cursorDay=01;; 
2) cursorDay=02;; 
3) cursorDay=03;; 
4) cursorDay=04;; 
5) cursorDay=05;; 
6) cursorDay=06;; 
7) cursorDay=07;; 
8) cursorDay=08;; 
9) cursorDay=09; 

esac 

echo "$cursorDay"; 

Der Ausgang, den ich erwarte, ist "03", und tatsächlich bekomme ich diesen Ausgang. Aber wenn ich das gleiche tun, um zu versuchen und erhalten 08 bzw. 09, ich diesen Fehler:

line 100: let: cursorDay=08: value too great for base (error token is "08") 

die Frage ist, ist es eine Möglichkeit zu „zwingen“ es 08 und 09 zu behandeln, als nur regelmäßigen Zahlen? Ich habe mehrere Beiträge gefunden, die detailliert beschreiben, wie man die Null beseitigt, aber ich will eine Null.

+0

Sie könnten mehr Einblick in Ihrem Problem bekommen, wenn Sie erkennen Sie die _strings_ "01" wollen .. "09", nicht die _numbers_. – Wrikken

Antwort

8

Wenn Sie arithmetische Ausdrücke auswerten (wie let der Fall ist), ein führender 0 zeigt eine Oktalzahl. Sie können Bash zwingen, eine gegebene Basis zu verwenden, indem Sie Basis der Nummer voranstellen. Zusätzlich können Sie printf verwenden, um Nummern mit führenden Nullen zu füllen.

So könnte Ihr Beispiel als

neu geschrieben wird
cursorDay=2 

let cursorDay=10#$cursorDay+1 
printf -v cursorDay '%02d\n' "$cursorDay" 

echo "$cursorDay" 

oder sogar kürzer als

cursorDay=2 

printf -v cursorDay '%02d\n' $((10#$cursorDay + 1)) 

echo "$cursorDay" 

Bitte beachten Sie, dass Sie nicht die $ zwischen den # und dem Variablennamen weglassen.

+0

Es ist nicht notwendig, base-10 für den cursorDay anzugeben, da dies der Standardwert ist. Genauer gesagt, lassen Sie 'printf' die Zeichenfolgendarstellung der Ganzzahl mit der'% 02d'-Spezifikation formatieren, anstatt zu versuchen, die "0" selbst hinzuzufügen. – chepner

+1

Nein, der Standardwert ist die automatische Erkennung basierend auf dem Präfix. Wenn Sie cursorDay = 2 durch cursorDay = 08 ersetzt haben, würde es ohne 10 # nicht funktionieren. Mein Verständnis der Frage war, dass CptSupermrkt 08 und 09 auch als cursorDay-Werte verwenden möchte. – Jacob

+0

Ah, guter Punkt. Ich nahm an, dass die führende Null nur zur Anzeige diente. Mein Kommentar zu dem Standard, der sich auf die Interpretation eines Zeichenfolgenwerts ohne führende 0 bezieht. Sie haben natürlich Recht, dass das Präfix 10 # notwendig ist, um "09" als Dezimalzahl 9 zu interpretieren. – chepner

1

Einfach die Nummer mit '0' voranstellen.

cursorDay=2; 
let cursorDay=$cursorDay+1; 

case "$cursorDay" in 
1) cursorDay=1;; 
2) cursorDay=2;; 
3) cursorDay=3;; 
4) cursorDay=4;; 
5) cursorDay=5;; 
6) cursorDay=6;; 
7) cursorDay=7;; 
8) cursorDay=8;; 
9) cursorDay=9;; 
esac 
echo "0$cursorDay"; 

ODER

 case 
    ... 
    7) cursorDay="07";; 
    8) cursorDay="08";; 
    9) cursorDay="09";; 

let numericValue=$(expr $cursorDay + 0) 
4

Eine kurze Lösung ohne 'Fall':

((cursorDay++))     # increment 
cursorDay=0$cursorDay    # add leading 0 
echo "${cursorDay: -2}"   # echo last 2 characters 
Verwandte Themen