シェルのprintfでパラメータを2回使用する方法は?

シェルのprintfでパラメータを2回使用する方法は?

printf %s%s one two印刷onetwoが、私は欲しいoneonetwotwo

どうすればいいですか?

答え1

zshから:

printf '%1$s%1$s' one two

GNU libcの1のような次の引数の代わりにn番目の引数を取るという点だけを除い%n$sて似ています(ただし、スタンドアロンGNUユーティリティやGNUシェルの組み込みには該当しません)。%sprintf()printfprintf

それ2001年にzshに追加されましたprintfいくつかのバリエーションがありますが、他の実装でも使用できます。POSIX規格の次のバージョンで指定される予定

これはzshでは機能しますが、サポートされているすべての実装printf '%s%1$s' one twoでは機能しません。printf%n$xn$

別のオプションは、例えば匿名関数で配列圧縮演算子を使用することです。

(){ printf %s%s ${argv:^argv}; } one two

ここでzip$argvと一緒にone one two two渡されますprintf。通常どおりに空の要素を変更する"${(@)argv:^argv}"か、"${@:^argv}"そのままにします。


構文%$nXprintf()POSIXであり、おそらくSVR4(SVR3ではなくSVR4)に由来しています。nl_printf()メッセージの要素の順序は、ある言語から別の言語に変更される可能性があるメッセージのローカライゼーションの最初の使用に由来しています。

関連情報