2013-04-23 54 views
5

問題出在數字08和09.我用谷歌搜索了這個,發現08和09有問題的原因,但沒有解決方案。遞增一個數字並在Bash中添加一個前導零

這是一個無意義的例子,用於簡要描述我的問題而不涉及細節。

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"; 

我期望的輸出是「03」,事實上我確實得到了這個輸出。但是,如果我做同樣的事情,試圖得到08或09,我這個錯誤:

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

的問題是,有沒有什麼方法來「逼」它來治療08和09的只是普通的數字?我發現幾個帖子詳細說明如何消除零,但我爲零。

+0

當你意識到你想_strings_「01」你可能會在你的問題更深入的瞭解。「09」,而不是_numbers_。 – Wrikken 2013-04-23 23:32:14

回答

8

當你評估算術表達式(如讓利確實)是一家領先的0表示八進制數。您可以強制bash使用給定的基數,前綴基數#爲數字。 另外,您可以使用printf填充前導零的數字。

所以,你的例子可以改寫爲

cursorDay=2 

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

echo "$cursorDay" 

甚至更​​短

cursorDay=2 

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

echo "$cursorDay" 

請注意,您不能省略#和變量名之間的$

+0

不需要爲cursorDay指定base-10,因爲它是默認值。更重要的是,您可以使用'%02d'規範讓'printf'格式化整數的字符串表示形式,而不是嘗試自己添加「0」。 – chepner 2013-04-24 12:47:37

+1

不,默認值是基於前綴的自動檢測。如果你用cursorDay = 08替換cursorDay = 2,沒有10#就不能工作。我對這個問題的理解是,CptSupermrkt想要使用08和09作爲cursorDay的值。 – Jacob 2013-04-24 15:24:14

+0

啊,好點。我認爲前導零僅用於顯示目的。我對默認值的評論指的是解釋一個沒有前導0的字符串值。當然,你認爲10#前綴是解釋「09」爲十進制數字9所必需的。 – chepner 2013-04-24 16:09:00

1

只需在'0'前添加數字即可。

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"; 

OR

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

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

無「情況」 A簡短的解決方案:

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