在 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 为基数而不是八进制。
在我的 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 为基数而不是八进制。