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 表示八进制数。您可以通过在数字前加上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 回答