具有多个以空格分隔的参数的 printf 如何工作

具有多个以空格分隔的参数的 printf 如何工作

我有以下printf功能:

$ printf '%s %s %s\t%s\n' 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt | git mktree

谁能解释一下它会产生什么以及为什么?我希望每个参数字符串都有相同数量的格式选项%s,但这里有更多的参数字符串。

答案1

该格式可根据需要多次重复使用以显示所有参数。如果参数太少,则缺少的参数将被视为空字符串。

例子

以下是指定两个参数但只提供一个的格式示例:

$ printf '%s ; %s ;\n' a
a ;  ;

这是相同的格式,这次提供了太多参数:

$ printf '%s ; %s ;\n' a b c
a ; b ;
c ;  ;

以下是问题中的示例,其中格式需要四个参数。由于提供了八个参数,整个格式被使用两次:

$ printf '%s %s %s\t%s\n' 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt
100644 blob 8e1e        f1.txt
100644 blob 9de7        f2.txt

文档

来自 man bash:

根据需要重用该格式以消耗所有参数。如果格式需要的参数多于提供的参数,则额外的格式规范的行为就像已提供适当的零值或空字符串一样。成功时返回值为零,失败时返回非零。

相关内容