
文字列置換を使用して配列を結合しようとしています。出力:
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#?}
最初の文字 (追加したコンマ) が削除されます。