`printf "%s"`が次の2つの文字列を一緒に連結するのはなぜですか? [コピー]

`printf "%s"`が次の2つの文字列を一緒に連結するのはなぜですか? [コピー]
$ printf "%s" a b
ab$ printf "%s%s" a b
ab

書式指定子の理解にはいくつかの問題がありますprintf。私の言葉が正しい場合は、基本的にCプログラミング言語の文字列と同じです。

書式指定子が%s次の2つの文字列を一緒に連結するのはなぜですか?

%s1つの文字列だけを表現して置き換え、残りの文字列は無視したらどうでしょうか?

%sunderとunder両方の文字列の結果が同じであるのはなぜですか%s%s

答え1

それはprintf行動方法を指定します。:

これ滞在オペランドは必要に応じて再利用する必要があります。ディスカッションオペランド。追加のb、c、またはs変換指定子は、空の文字列引数が指定されているかのように評価されます。他の追加変換仕様は、ゼロ個の引数が与えられたかのように評価されます。もし滞在オペランドに変換仕様が含まれておらず、ディスカッションオペランドがありますが、結果は指定されていません。

あなたの場合は、%sすべてのパラメータを処理するのに必要な数だけフォーマットが繰り返されます。

printf "%s" a b

そして

printf "%s%s" a b

%s2回繰り返された最初のケ​​ースと同じ結果を生成します%s%s

答え2

書式文字列が予想よりも多くの引数を指定すると、printf書式文字列が繰り返されます。

例えば

$ printf "%s -- %s" a b c d e
a -- bc -- de -- 

%s -- %sフォーマットが効果的に繰り返されることがわかります。

たとえば、書式設定に役立ちます。

$ printf "%s -- %s\n" a b c d e
a -- b
c -- d
e -- 

関連情報