【问题标题】:Bash printf: how to understand zero dot s ("%0.s") syntaxBash printf:如何理解零点 s ("%0.s") 语法
【发布时间】:2019-01-28 06:30:12
【问题描述】:

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

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

读自man printf

...

s
打印字符串参数中的字节,直到结束 达到或直到达到精度规范指示的字节数;但是,如果精度为 0 或丢失,字符串被完全打印。

...

我还是不知道上面的代码。

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

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

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

...

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

...

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

【问题讨论】:

标签: bash syntax


【解决方案1】:

这个例子可以阐明宽度字段是如何工作的

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../

【讨论】:

    【解决方案2】:

    您所遇到的典型问题是,格式说明符

    的实际参数少
    printf "%0.s../" 1 2
    

    Bash 将说明符规则与参数一对一地应用,但在不正确匹配的情况下,说明符规则基本上被复制,就好像它运行为

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

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

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

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

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

    printf '%4.2f\n' 1323.343233
    1323.34
    

    printf() 理解为您有一个由点前 4 位数字和最大 2 位精度数字组成的数字。

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 2018-10-07
      • 2015-02-15
      • 2017-01-17
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多