文字列置換を使用して配列を結合しますか?

文字列置換を使用して配列を結合しますか?

文字列置換を使用して配列を結合しようとしています。出力:

a,b,c

以下は動作しますが、パイピングなしで実行する方法はありませんか?

#!/bin/bash

words=(a b c)

echo "${words[@]}" | sed 's/ /,/g'

これを試してみましたが、うまくいきませんでした。

echo "${words[@]// /,/}"

答え1

特定の文字で区切られた配列の要素からなる文字列を出力したい場合は、

words=(a b c)

( IFS=,; printf '%s\n' "${words[*]}" )

in*の代わりにinを使用すると、配列のすべての要素を連結した単一の文字列が作成されます。要素は の最初の文字で区切られるため、展開を行う前にこれをコンマに設定します。@"${words[*]}"words$IFS

IFS呼び出しのカンマ区切り文字列を作成するために必要な単一の展開以外の操作に誤って設定されないように、サブシェルを設定しましたprintf

サブシェルを使用してIFSローカルに設定する代わりに、設定してからリセットすることもできます。

words=(a b c)

IFS=,$IFS
printf '%s\n' "${words[*]}"
IFS=${IFS#?}

これはまず の最初の文字としてコンマを追加し$IFS、変数の古い値をコンマの後の文字として保持します。

パラメータ置換により、${IFS#?}最初の文字 (追加したコンマ) が削除されます。

関連情報