状況:コマンド出力を配列に保存する必要があります。各行は1つの要素です。行にスペースが含まれているため、すべてが混乱する可能性があります。
一般的に私はそのようなことをしますARRAY=($(command))
。しかし、このようなことをしようとすると、ARRAY=($(printf '%s\n' "first line" "second line"))
配列は次のようになります。
$ for x in "${ARRAY[@]}"; do echo $x; done
first
line
second
line
少し醜いですが、私が望む動作を達成する方法を見つけました。
$ readarray -t ARRAY < <(printf '%s\n' "first line" "second line")
$ for x in "${ARRAY[@]}"; do echo $x; done
first line
second line
これを行うより良い方法を知っている人はいますか?私は何を逃したことがありませんか?
答え1
readarray
/mapfile
はいこれただし、この機能はbash v4に追加されているため、その機能がないシステム(macos)を使用している場合は、はるかに「醜い」方法で実行できます。
IFS=$'\n' array=($(printf '%s\n' "first line" "second line"))
またはもっと醜い方法で:
while IFS= read -r line; do
array+=("$line")
done < <(printf '%s\n' "first line" "second line")