Bash

Bashの配列でjoinやsplitする

More than 3 years have passed since last update.

※ここに書いた僕のコードはBashの基本ルールを確認しながら構築した手法って感じですが、コメントでは別の良いやり方が紹介されてるのでそちらも要チェックです!

※この記事の手法は、区切り文字が1文字のみが対象です。2文字以上の区切り文字でjoin/splitをしたい場合はこの記事の手法は使えないので他の方法を頑張ってください。


join

多分一番スマートと思われる方法。IFS変更の影響をサブシェルに閉じ込めて捨ててるのがポイント。


join-example.sh

arr=(a "b c" $'d\ne' f)

# join実行
str="$(IFS=,; echo "${arr[*]}")"

# 確認
echo "=== before ==="
for v in "${arr[@]}"; do
echo "[$v]"
done
echo "=== after ==="
echo "$str"



output

=== before ===

[a]
[b c]
[d
e]
[f]
=== after ===
a,b c,d
e,f


split

splitをスマートに書くのは無理ぽいので、普通にIFSを一時退避して戻すという手順をとる。


split-example.sh

str=$'a,b c,d\ne,f'

# split実行
IFS_ORIGINAL="$IFS"
IFS=,
arr=($str)
IFS="$IFS_ORIGINAL"

# 確認
echo "=== before ==="
echo "$str"
echo "=== after ==="
for v in "${arr[@]}"; do
echo "[$v]"
done



output

=== before ===

a,b c,d
e,f
=== after ===
[a]
[b c]
[d
e]
[f]