在bash中修复整数长度时的奇怪行为

时间:2017-09-18 13:23:40

标签: bash integer printf decimal octal

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

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

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

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

对第一种情况发生的原因有什么见解吗?

1 个答案:

答案 0 :(得分:2)

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

要修复它,您可以使用参数展开来删除零:

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

我删除了echo $(...)构造,并在格式化字符串中插入换行符。

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

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

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

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