如何在shell中的printf中使用参数两次?

the*_*sti 5 shell zsh printf

printf %s%s one two打印onetwo但我想要oneonetwotwo

我怎样才能做到这一点?

Sté*_*las 8

在 zsh 中:

\n
printf \'%1$s%1$s\' one two\n
Run Code Online (Sandbox Code Playgroud)\n

除了它使用第 n参数而不是像GNU libc 的 \xc2\xb9这样的下一个参数(但不在独立的 GNU实用程序中,也不是在 GNU shell (bash) 的内置函数中)之外,哪里%n$s都是类似的。%sprintf()printfprintf

\n

于 2001 年添加到 zsh 中,并且在其他一些printf实现中也可用,尽管有一些变化,并将在 POSIX 标准的下一版本中指定

\n

请注意,虽然printf \'%s%1$s\' one two在 zsh 中也可以工作,但它并不适用于所有printf支持的实现,并且如果混合%n$x使用指令和不使用指令,则 POSIX 将使行为未指定。n$

\n

另一种选择是使用数组压缩运算符,例如在匿名函数中:

\n
(){ printf %s%s ${argv:^argv}; } one two\n
Run Code Online (Sandbox Code Playgroud)\n

其中 zip$argv与其自身一起导致one one two two被传递到printf. 像往常一样,更改为"${(@)argv:^argv}""${@:^argv}"保留 any 中的空元素。

\n
\n

%$nX语法printf()是 POSIX,可能起源于 SVR4(是在 SVR4,而不是 SVR3),可能来自nl_printf()早期用于消息本地化的消息,其中消息中元素的顺序可能从一种语言更改为另一种语言。

\n