在 zsh 中:
\nprintf \'%1$s%1$s\' one two\nRun Code Online (Sandbox Code Playgroud)\n除了它使用第 n个参数而不是像GNU libc 的 \xc2\xb9这样的下一个参数(但不在独立的 GNU实用程序中,也不是在 GNU shell (bash) 的内置函数中)之外,哪里%n$s都是类似的。%sprintf()printfprintf
它于 2001 年添加到 zsh 中,并且在其他一些printf实现中也可用,尽管有一些变化,并将在 POSIX 标准的下一版本中指定
请注意,虽然printf \'%s%1$s\' one two在 zsh 中也可以工作,但它并不适用于所有printf支持的实现,并且如果混合%n$x使用指令和不使用指令,则 POSIX 将使行为未指定。n$
另一种选择是使用数组压缩运算符,例如在匿名函数中:
\n(){ printf %s%s ${argv:^argv}; } one two\nRun Code Online (Sandbox Code Playgroud)\n其中 zip$argv与其自身一起导致one one two two被传递到printf. 像往常一样,更改为"${(@)argv:^argv}"或"${@:^argv}"保留 any 中的空元素。
该%$nX语法printf()是 POSIX,可能起源于 SVR4(是在 SVR4,而不是 SVR3),可能来自nl_printf()早期用于消息本地化的消息,其中消息中元素的顺序可能从一种语言更改为另一种语言。