在我的bash脚本中,我设置了以下操作
year=0050
echo $(printf %04d $year)
>0040
我不明白为什么返回0040而不是0050.我最终发现要让系统正确打印0050,我将不得不这样做。
year=50
echo $(printf %04d $year)
>0050
对第一种情况发生的原因有什么见解吗?
答案 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而不是八进制。