chiwata’s blog

たまに技術の話をします。

bashでechoした複数行の値を配列に格納する

2020年になっても相変わらずのんびりやっています。

さて、いつも同期に聞かれて知らないものを調べてブログに書いていますが、今回もそれです。

複数行になっているデータを、下のように変数に格納しようとすると

#!/bin/bash

data="1
2
3"

declare -a array=()

echo "$data" | while read line
do
        array+=($line)
done

echo "${#array[@]}"
$ bash test.sh
0

このように要素数が0個に見えます 配列の追加の下に要素数を見る echo "${#array[@]}" を追加し確認してみると

$ bash test.sh
1
2
3
0

このように一度は格納されていますね これはパイプの後ろがサブシェルで実行されるので、親側での変数が変化していないため なので、親のシェルで実行されるように

#!/bin/bash

data="1
2
3"

declare -a array=()

while read line
do
        array+=($line)
done < <(echo "$data")

echo "${#array[@]}"
$ bash test.sh
3

このように標準入力にしてあげるとよいようですね