Bash に次のような配列がある場合:
FOO=( a b c )
要素をコンマで結合するにはどうすればよいでしょうか? たとえば、 を作成しますa,b,c
。
ベストアンサー1
複数文字の区切り文字をサポートする 100% 純粋な Bash 関数は次のとおりです。
function join_by {
local d=${1-} f=${2-}
if shift 2; then
printf %s "$f" "${@/#/$d}"
fi
}
例えば、
join_by , a b c #a,b,c
join_by ' , ' a b c #a , b , c
join_by ')|(' a b c #a)|(b)|(c
join_by ' %s ' a b c #a %s b %s c
join_by $'\n' a b c #a<newline>b<newline>c
join_by - a b c #a-b-c
join_by '\' a b c #a\b\c
join_by '-n' '-e' '-E' '-n' #-e-n-E-n-n
join_by , #
join_by , a #a
上記のコードは、@gniourf_gniourf、@AdamKatz、@MattCowell、@x-yuri のアイデアに基づいています。オプションerrexit
( set -e
) およびnounset
( set -u
) で動作します。
あるいは、単一の文字区切り文字のみをサポートするより単純な関数は次のようになります。
function join_by { local IFS="$1"; shift; echo "$*"; }
例えば、
join_by , a "b c" d #a,b c,d
join_by / var local tmp #var/local/tmp
join_by , "${FOO[@]}" #a,b,c
このソリューションは、Pascal Pilz のオリジナルの提案に基づいています。
ここで以前に提案された解決策の詳細な説明は、「bash スクリプトで配列要素を join() する方法」、dev.toのmeleuによる記事。