1. ホーム
  2. arrays

[解決済み] Bashで配列の要素を結合するには?

2022-03-20 19:47:27

質問

Bashでこのような配列があった場合。

FOO=( a b c )

カンマで要素を結合するには? 例えば a,b,c .

解決方法は?

複数文字のデリミタをサポートする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 ).

あるいは、1文字のデリミタのみをサポートする、よりシンプルな関数もあります。

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のオリジナルの提案に基づくものです。

以前にここで提案した解決策の詳細な解説は の記事、"How to join() array elements in a bash script"。 メレウ デブ・トゥ .