Чтение разделенной строки в массив в Bash - PullRequest
186 голосов
/ 15 февраля 2012

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

line="1 1.50 string"

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

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

выходы

1
1.50
string

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

arr=$(echo ${line})

Если после этого выполнить приведенные выше операторы echo, я получу:

1 1.50 string
[empty line]
[empty line]

Я тоже пытался

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

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

Ответы [ 5 ]

293 голосов
/ 15 февраля 2012

Чтобы преобразовать строку в массив, используйте

arr=($line)

или

read -a arr <<< $line

Крайне важно не использовать кавычки, поскольку это помогает.

37 голосов
/ 13 сентября 2013

Попробуйте это:

arr=(`echo ${line}`);
24 голосов
/ 03 ноября 2016

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

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

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

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

3 голосов
/ 19 ноября 2018

Если вам нужно расширение параметров, попробуйте:

eval "arr=($line)"

Например, возьмите следующий код.

line='a b "c d" "*" *'
eval "arr=($line)"
for s in "${arr[@]}"; do 
    echo "$s"
done

Если в текущем каталоге содержатся файлы a.txt, b.txt и c.txt, то выполнение кода приведет к следующему выводу.

a
b
c d
*
a.txt
b.txt
c.txt
0 голосов
/ 03 марта 2014
line="1 1.50 string"

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

for x in $arr
do
echo "> [$x]"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...