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

标签 bash unix leading-zero

问题出在数字 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 视为常规数字吗?我找到了几篇详细介绍如何消除零的帖子,但我想要一个零。

最佳答案

当您评估算术表达式时(如 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"

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

关于bash - 在 Bash 中递增数字并添加前导零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16180774/

相关文章:

php - 在数字的小数点前添加零

c - 使用 Shell 脚本将数据发送到正在运行的进程

linux - 运行命令前检查用户是否可以访问/根目录

Bash 脚本跳过密码保护文件的提取

bash - 源 shell 脚本的退出代码

c++ - “rusage” 统计

Perl - 如何在不使用 DateTime 的情况下从给定日期获取上一个星期三的日期

linux - 如何处理异步套接字上所有可能的错误?

php - 如何在日期和月份不带前导零的情况下验证日期?

r - 如何生成一个汇总统计表,其中所有相关的小数位都出现在 R 的结果表中?