Чтение разделительной строки в массив в Bash

У меня есть переменная, которая содержит строку с разделителями-пробелами:

line="1 1.50 string"

Я хочу разбить эту строку с пробелом как разделителем и сохранить результат в массиве, чтобы следующее:

echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}

выходы

1
1.50
string

Где-то я нашел решение, которое не работает:

arr=$(echo ${line})

Если после этого я запустил вышеприведенные выражения эха, я получаю:

1 1.50 string
[empty line]
[empty line]

Я также пробовал

IFS=" "
arr=$(echo ${line})

с тем же результатом. Может кто-нибудь помочь, пожалуйста?

Ответ 1

arr=($line)

или

read -a arr <<<$line

Ответ 2

Попробуйте следующее:

arr=(`echo ${line}`);

Ответ 3

В: arr=( $line ). "Разделение" связано с "глобусом".
Подстановочные знаки (*, ? и []) будут расширены для сопоставления имен файлов.

Правильное решение немного сложнее:

IFS=' ' read -a arr <<<"$line"

Нет проблемы с глотанием; разделительный символ устанавливается в $IFS, цитируемые переменные.

Ответ 4

line="1 1.50 string"

arr=$( $line | tr " " "\n")

for x in $arr
do
echo "> [$x]"
done