web-dev-qa-db-ja.com

リスト/配列をxargsにエコーする

リスト/配列があるとしましょう:

list=(a b c)

各要素をxargsにエコーするにはどうすればよいですか?何かのようなもの:

for v in list; do echo v; done; | xargs

より冗長な方法はありますか?

1
Alexander Mills
printf '%s\n' "${list[@]}" | xargs

これにより、listの各要素が独自の行に出力され、改行区切りのリストがxargsに渡されます。

"${list[@]}"は、listの個別に二重引用符で囲まれた要素に展開されます。 printfは、フォーマット文字列にプレースホルダーがあるよりも多くの引数が与えられた場合、そのフォーマット文字列を再利用します。

5
Kusalananda

特に長いリストでない限り、xargsを完全に省くことができるかもしれません

list=(a b c)

# With xargs
printf "%s\n" "${list[@]}" | xargs foo    # Results in « foo a b c »

# Without xargs
foo "${list[@]}"                          # Also results in « foo a b c »

もちろん、これを状況に適用できるかどうかは、実際のxargsコマンドに渡す追加のフラグ(存在する場合)によって異なります。

1
roaima