在Bash中递增数字并添加前导零

在Bash中递增数字并添加前导零,bash,unix,leading-zero,Bash,Unix,Leading Zero,问题在于数字08和09。我用谷歌搜索了一下,找到了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) c

问题在于数字08和09。我用谷歌搜索了一下,找到了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”就行了

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


计算算术表达式时(如let-do),前导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"

请注意,您不能忽略
#
和变量名之间的
$

没有“case”的简短解决方案:

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

当您意识到需要字符串“01”时,您可能会对问题有更多的了解。。“09”,而不是数字。没有必要为cursorDay指定base-10,因为这是默认值。更重要的是,您可以让
printf
使用
%02d
规范格式化整数的字符串表示形式,而不是自己尝试添加“0”。否,默认设置是基于前缀的自动检测。如果将cursorDay=2替换为cursorDay=08,则如果没有10#,它将无法工作。我对这个问题的理解是,CptSupermrkt也希望使用08和09作为cursorDay值。啊,好的观点。我假设前导零仅用于显示目的。我对默认值的评论是指解释没有前导0的字符串值。当然,您是正确的,将“09”解释为十进制数字9需要10#前缀。
((cursorDay++))                   # increment
cursorDay=0$cursorDay             # add leading 0
echo  "${cursorDay: -2}"          # echo last 2 characters