问题在于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视为普通数字?我找到了几个帖子,详细说明了如何消除零,但我想要零。
答案 0 :(得分:8)
当您评估算术表达式(如let)时,前导0表示八进制数。您可以通过在 base #
前加上数字来强制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"
请注意,您无法省略$
和变量名称之间的#
。
答案 1 :(得分:4)
没有“案例”的简短解决方案:
((cursorDay++)) # increment
cursorDay=0$cursorDay # add leading 0
echo "${cursorDay: -2}" # echo last 2 characters
答案 2 :(得分: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)