2012-01-07 3 views
7

Я пытаюсь преобразовать вывод команды, как echo -e "a b\nc\nd e" в массив.Как преобразовать вывод команды в массив по строкам в bash?

X=($(echo -e "a b\nc\nd e")) 

расколы вход для каждой новой строки и символ пробела:

$ echo ${#X[@]} 
> 5 

for i in ${X[@]} ; do echo $i ; done 
a 
b 
c 
d 
e 

Результат должен быть:

for i in ${X[@]} ; do echo $i ; done 
a b 
c 
d e 
+0

возможно дубликат [Как создать массив в Баш из переменной команды?] (Http://stackoverflow.com/questions/8750848/how-do-i-create-an-array-in -bash-from-a-command-variable) – Cascabel

+0

Кто-то может найти лучший дубликат; это только самое последнее. Вероятно, этот вопрос задавали десятки раз. – Cascabel

ответ

13

Вы должны изменить Внутренний разделитель полей переменную (IFS) до первой строки.

$ IFS=$'\n'; arr=($(echo -e "a b\nc\nd e")); for i in ${arr[@]} ; do echo $i ; done 
a b 
c 
d e 
+0

Спасибо за объяснения. Мне интересно, почему вы используете 'echo -e', а не просто' echo'. Любая причина? – phs

+0

флаг '-e' сообщает echo, чтобы интерпретировать escape-символы обратной косой черты, такие как' \ n', чтобы выводить новую строку и букву '\ n' – SiegeX

0

Установите IFS в newline. По умолчанию это space.

[jaypal:~] while IFS=$'\n' read -a arry; do 
echo ${arry[0]}; 
done < <(echo -e "a b\nc\nd e") 
a b 
c 
d e 
+5

Нет, по умолчанию это' $ '\ t \ n'', пробелы tabs и новые строки. – Cascabel

Смежные вопросы