[英]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()
理解。
您无需首先echo
显printf()
的输出。 您可以在末尾使用格式说明符\\n
来打印换行符。
printf "%0.s..%0.s/\n" 1 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.