新答案使用%08.0f

新答案使用%08.0f

我正在尝试将零填充到数字

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"

相关内容