繁体   English   中英

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

[英]Bash printf: how to understand zero dot s (“%0.s”) syntax

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

echo $(printf "%0.s../"  2  ); 
# ../
echo $(printf "%0.s../"  );   
# ../
echo $(printf "%0.s../" 1 );
# ../

man printf阅读,

...

小号
将打印来自字符串参数的字节,直到达到末尾或达到精度规范指示的字节数为止; 但是,如果精度为0或缺少精度,则将完全打印字符串。

...

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

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

# repeating character 
echo $(printf "%0.s../" 1 2  );
# ../../

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

...

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

...

还没有。 我需要一些解释。

此示例可以阐明width字段的工作原理

printf '%.0s../\n' ABCDEFG
../
printf '%.1s../\n' ABCDEFG
A../
printf '%.2s../\n' ABCDEFG
AB../
printf '%.7s../\n' ABCDEFG
ABCDEFG../

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

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

printf '%.7s../\n' ABCDEFG abcdefg
ABCDEFG../
abcdefg../

你有什么是具有为的情况下,格式说明比实际参数少于的经典问题

printf "%0.s../" 1 2

Bash与参数一对一地应用说明符规则,但是如果匹配不正确,说明符规则基本上会被复制,就像它以

printf "%0.s../../" 1

您需要为2添加一个额外的说明符

printf "%0.s..%0.s/" 1 2

在这种情况下,由于格式设置规则匹配,您只会得到一个../输出。

至于语法%0.s ,似乎已经截断了您所提供的参数字符串。 您的逻辑唯一的问题是上述错误的说明符。 在外壳中打印长值时,宽度字段更有意义,在外壳中,精确度由宽度字段控制。 例如

printf '%4.2f\n' 1323.343233
1323.34

当您的数字由点前的4位数字和最多2的精度数字组成时, printf()理解。

您无需首先echoprintf()的输出。 您可以在末尾使用格式说明符\\n来打印换行符。

printf "%0.s..%0.s/\n" 1 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM