在 bash 中固定整数长度时出现奇怪的行为

strange behavior when fixing integer lengths in bash

在我的 bash 脚本中,我设置了以下操作

year=0050
echo $(printf %04d $year)
>0040

我不明白为什么返回 0040 而不是 0050。我最终发现要让系统正确打印 0050,我将不得不这样做。

year=50
echo $(printf %04d $year)
>0050

对于第一种情况发生的原因,是否有任何见解?

这是因为带前导零的数字被 Bash 解释为八进制,而八进制的 50 是十进制的 40。

要修复它,您可以使用参数扩展去除零:

$ printf '%04d\n' "${year##+(0)}"
0050

我放弃了 echo $(...) 结构并在格式化字符串中插入了换行符。

请注意 +(0) 模式需要 extglob shell 选项 (shopt -s extglob)。

或者(更便携),您可以先使用算术展开转换数字:

% printf '%04d\n' "$(( 10#$year ))"
0050

这使用 <i>base</i>#<i>n</i> 符号表示 n(在我们的例子中:$year)以 10 为基数而不是八进制。