我正在尝试将零填充到一个数字
a=010
printf "%04d" $a
0008
Run Code Online (Sandbox Code Playgroud)
我需要“输出”为“0010”,它正在转换值。
甚至尝试排版
a=010
typeset -RZ2 a
echo $a
Run Code Online (Sandbox Code Playgroud)
当我在脚本中使用它时,出现以下错误:
Invalid -R option
Run Code Online (Sandbox Code Playgroud)
Bar*_*run 15
不要在数字的开头放一个“0”——它以八进制为基数处理数字。只需分配十进制数。
a=10
printf "%04d" $a
0010
Run Code Online (Sandbox Code Playgroud)
如果您正在从其他地方读取数字,您可以考虑删除开头的 0,如下所示:
a=0010
b=$(echo $a | sed 's/^0*//')
printf "%04d" $a
0008
printf "%04d" $b
0010
Run Code Online (Sandbox Code Playgroud)
F. *_*uri 12
%08.0f由于%f用于打印十进制浮点数,参数必须为十进制。
所以没有看到参数被解释为八进制的风险:
简单地做:
a=0010
a=`printf %08.0f $a`
Run Code Online (Sandbox Code Playgroud)
或者
a=$(printf %08.0f $a)
Run Code Online (Sandbox Code Playgroud)
然后
echo $a
00000010
Run Code Online (Sandbox Code Playgroud)
这项工作可以在任何POSIX shell下找到
使用bash,您可以通过使用以下-v选项来避免分叉printf:
a=0010
printf -v a %08.0f $a
echo $a
00000010
Run Code Online (Sandbox Code Playgroud)
%d)您可以0使用以下命令删除左侧字符:
a=00010
while [ "$a" != "${a#0}" ] ;do a=${a#0};done
printf "%08d" $a
00000010
Run Code Online (Sandbox Code Playgroud)
由于这不会分叉新的命令会话,因此这可能比使用sed.
您可以使用以下语法强制十进制解释:
a=000010
printf "%08d" $((10#$a))
00000010
Run Code Online (Sandbox Code Playgroud)
这可能对转换有用:
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
Run Code Online (Sandbox Code Playgroud)
等等...
a="zz"
printf "%04d" $((36#$a))
1295
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以通过使用不同的转换说明符来实现这一点,例如“f”说明符。从printf 手册:
f, f
double 参数被四舍五入并转换为 [-]ddd.ddd 样式中的十进制表示法,其中小数点字符后的位数等于精度规范。如果精度缺失,则取6;如果精度明确为零,则不会出现小数点字符。如果出现小数点,则在其前面至少出现一位。
但是我们真的不想要您的数字的浮点表示,因此我们必须指定精度为零。这应该这样做:
a=010
printf "%04.0f" $a
Run Code Online (Sandbox Code Playgroud)
我假设您使用的是 Linux,但这也应该适用于其他类型的 Unix。