Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash printf:如何理解零点s(“0.s”)语法_Bash_Syntax - Fatal编程技术网

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

Bash printf:如何理解零点s(“0.s”)语法,bash,syntax,Bash,Syntax,使用Bashprintf,我不知道如何理解下面代码的语法 echo $(printf "%0.s../" 2 ); # ../ echo $(printf "%0.s../" ); # ../ echo $(printf "%0.s../" 1 ); # ../ 从man printf中读取 s 字符串参数中的字节将一直打印到结束 达到或直到达到精度规格指示的字节数;但是,如果精度为0 或丢失,字符串将全部打印 我仍然不知道上面的代码 为什么下面的代码会重复打印 # repe

使用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  );
# ../../
从表面上看

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


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

此示例可能会阐明宽度字段的工作原理

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
哪个
printf()
理解为您有一个由点前面的4位数字和最大2位精度数字组成的数字

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

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