web-dev-qa-db-ja.com

スペースで区切られた複数の引数を持つprintfはどのように機能しますか

次のprintf関数があります。

$ printf '%s %s %s\t%s\n' 100644 blob 8e1e f1.txt 100644 blob 9de7 f2.txt | git mktree

誰がそれが生み出すものとその理由を説明できますか?同じ数のフォーマットオプションがあると期待していました%sは各引数文字列ですが、ここにはより多くの引数文字列があります。

3
Maxim Koretskyi

この形式は、すべての引数を表示するために必要な回数だけ再利用されます。引数が少なすぎる場合、不足している引数は空の文字列として扱われます。

2つの引数を指定する形式の例を次に示しますが、1つしか指定されていません。

$ printf '%s ; %s ;\n' a
a ;  ;

同じ形式ですが、今回は引数が多すぎます。

$ printf '%s ; %s ;\n' a b c
a ; b ;
c ;  ;

これは、形式が4つの引数を期待する質問の例です。 8つの引数が提供されるため、フォーマット全体が2回使用されます。

$ 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

ドキュメンテーション

Man bashから:

この形式は、すべての引数を消費するために必要に応じて再利用されます。提供されているよりも多くの引数がフォーマットに必要な場合、追加のフォーマット指定は、ゼロ値またはnull文字列が適切に提供されたかのように動作します。戻り値は、成功した場合はゼロ、失敗した場合はゼロ以外です。

9
John1024