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

Max*_*kyi 3 shell printf

我有以下printf功能:

$ printf '%s %s %s\t%s\n' 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt | git mktree
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*024 9

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

例子

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

$ printf '%s ; %s ;\n' a
a ;  ;
Run Code Online (Sandbox Code Playgroud)

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

$ printf '%s ; %s ;\n' a b c
a ; b ;
c ;  ;
Run Code Online (Sandbox Code Playgroud)

这是格式需要四个参数的问题的示例。由于提供了八个参数,因此整个格式使用了两次:

$ 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
Run Code Online (Sandbox Code Playgroud)

文档

从人bash:

根据需要重用该格式以使用所有参数。如果格式需要的参数多于提供的参数,则额外的格式规范的行为就好像提供了零值或空字符串(视情况而定)。成功时返回值为零,失败时非零。

  • 即使没有参数,格式也至少使用一次,这在像 `printf '* %s\n' "$@"` 这样的情况下很烦人,你必须使用 `[ "$#" -eq 0 ] || printf '* %s\n' "$@"`。 (2认同)