※ここに書いた僕のコードは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]