5

問題は数字の 08 と 09 にあります。これを Google で検索したところ、08 と 09 に問題がある理由がわかりましたが、解決策はありません。

これは、詳細に入ることなく私の問題を簡単に説明するために使用される無意味な例です。

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 を単なる通常の数字として扱うように「強制」する方法があるかどうかです。ゼロを削除する方法を詳しく説明している投稿をいくつか見つけましたが、ゼロが必要です。

4

3 に答える 3

9

算術式を評価する場合 (let のように)、先頭の 0 は 8 進数を示します。数値の前にbaseを付けることで、bash に特定の base を強制的に使用させることができます#。さらに、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"

と変数名の$間のは省略できませんので注意してください。#

于 2013-04-24T00:16:52.913 に答える
4

「ケース」のない短い解決策:

((cursorDay++))                   # increment
cursorDay=0$cursorDay             # add leading 0
echo  "${cursorDay: -2}"          # echo last 2 characters
于 2013-04-24T08:49:11.847 に答える
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";

また

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

let numericValue=$(expr $cursorDay + 0)
于 2013-04-23T23:22:52.533 に答える