我正在尝试将零填充到数字
a=010
printf "%04d" $a
0008
我需要“输出”为“0010”,它正在转换值。
甚至尝试过排版
a=010
typeset -RZ2 a
echo $a
当我在脚本中使用相同的内容时,出现以下错误:
Invalid -R option
答案1
不要在数字的开头放置“0”——它会将数字视为八进制根据。只需指定十进制数即可。
a=10
printf "%04d" $a
0010
如果您从其他地方读取数字,您可以考虑删除开头的 0,如下所示:
a=0010
b=$(echo $a | sed 's/^0*//')
printf "%04d" $a
0008
printf "%04d" $b
0010
答案2
新答案使用%08.0f
用于%f
打印十进制浮点数, 争论必须是十进制。
因此,将论证解释为没有风险八进制:
简单地做:
a=0010
a=`printf %08.0f $a`
或者
a=$(printf %08.0f $a)
然后
echo $a
00000010
这项工作可以在任何下找到POSIX壳
在下面巴什
使用巴什-v
,您可以通过使用以下选项来避免分叉printf
:
a=0010
printf -v a %08.0f $a
echo $a
00000010
旧答案(使用%d
)
在 POSIX 下壳
0
您可以使用以下命令删除左侧字符:
a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010
由于这不会分叉新的命令会话,因此这可能比使用sed
.
在下面巴什
您可以使用以下语法强制十进制解释:
a=000010
printf "%08d" $((10#$a))
00000010
这对于转换可能很有用:
a="0a"
printf "%04d" $((16#$a))
0010
a="00001010"
printf "%04d" $((2#$a))
0010
a="00012"
printf "%04d" $((8#$a))
0010
a="0020"
printf "%04d" $((5#$a))
0010
a="0013"
printf "%04d" $((7#$a))
0010
等等...
a="zz"
printf "%04d" $((36#$a))
1295
答案3
您可以通过使用不同的转换说明符(例如“f”说明符)来实现此目的。来自打印手册:
, F
double 参数被四舍五入并转换为 [-]ddd.ddd 样式的十进制表示法,其中小数点字符后的位数等于精度规范。如果精度缺失,则取6;如果精度明确为零,则不会出现小数点字符。如果出现小数点,则其前面至少出现一位数字。
但我们并不真正想要数字的浮点表示,因此我们必须指定精度为零。这应该可以做到:
a=010
printf "%04.0f" $a
我假设您使用的是 Linux,但这也应该适用于其他版本的 Unix。
答案4
typeset -Z4 a
将与zsh
或一起使用ksh
。
当解释为数字时,在 POSIX sh 和 printf 中,如果有前导零,则将其解释为八进制数。所以,你需要0
先删除这些:
printf '%04d\n' "${a#"${a%%[!0]*}"}"
或者你可以使用awk
没有这个问题的:
awk 'BEGIN{printf "%04d\n", ARGV[1]}' "$a"