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