💡

【Bash】UTF-8 の文字列から1文字ずつ取り出す

2023/10/14に公開

Bash では文字列の文字数やスライスなど UTF-8 に対応しています。

str=あいうえお
echo ${#str}
5
echo ${str:0:1}

for..in ループを使って1文字ずつ取り出してみましょう。

for i in $(eval echo {0..$((${#str} - 1))}); \
do printf "${str:$i:1} "; \
done; echo
あ い う え お 

かっこが多くて何をやっているのかわかりにくいので、処理を分解してみます。

最初は範囲の上限の数値です。足し算、引き算のために $((...)) で囲んでいます。

echo $((${#str} - 1))
4

次はこの処理です。

echo {0..$((${#str} - 1))}
{0..4}

単なる文字列が生成されただけで、eval でコードとして評価します。

$ echo $(eval echo {0..$((${#str} - 1))})
0 1 2 3 4

今度は seq コマンドを使ってみます。少しコードが短くなります。

for i in `seq 0 $((${#str} - 1))`; do printf "${str:$i:1} "; done; echo
あ い う え お

Discussion