Bash printf:如何理解零点(“%0.s”)语法

bla*_*arl 4 syntax bash

使用 Bash printf,我不知道如何理解以下代码的语法。

echo $(printf "%0.s../"  2  ); 
# ../
echo $(printf "%0.s../"  );   
# ../
echo $(printf "%0.s../" 1 );
# ../
Run Code Online (Sandbox Code Playgroud)

读取自man printf,

...

s
打印字符串参数中的字节,直到到达末尾或达到精度规范指示的字节数;但是,如果精度为 0 或缺失,则会完整打印字符串。

...

而且我仍然不知道上面的代码。

为什么下面的代码会重复打印?

# repeating character 
echo $(printf "%0.s../" 1 2  );
# ../../
Run Code Online (Sandbox Code Playgroud)

从https://wiki.bash-hackers.org/commands/builtin/printf看到

...

。点:与字段宽度一起,当文本较长时,字段不会扩展,而是会被截断。“%.s”是“%.0s”的未记录等效项,它将强制字段宽度为零,从而有效地从输出中隐藏该字段

...

还没拿到。我需要一些解释。

Die*_*ano 5

这个例子可以阐明宽度字段的工作原理

printf '%.0s../\n' ABCDEFG
../
printf '%.1s../\n' ABCDEFG
A../
printf '%.2s../\n' ABCDEFG
AB../
printf '%.7s../\n' ABCDEFG
ABCDEFG../
Run Code Online (Sandbox Code Playgroud)

当宽度为 0 时,则根本不打印该字段。

然后,如果参数多于字段,printf则重复格式

printf '%.7s../\n' ABCDEFG abcdefg
ABCDEFG../
abcdefg../
Run Code Online (Sandbox Code Playgroud)