Оболочка читается из кошки построчно в массив - PullRequest
1 голос
/ 15 ноября 2010

У меня есть команда, которая выводит что-то вроде этого:

lucid32
lucid64

Мне нужно прочитать это в массив. Так что в данном конкретном случае мне нужен эквивалент:

boxes =(lucid32 lucid64)

Я пытался прочитать это так:

boxes=(`mycommand list | tr '\n' ' '`)

но возвращает $ '\ 033' [0Klucid

Как я могу это исправить?

ОБНОВЛЕНИЕ:

похоже, это не сработало, потому что эта команда выводит кучу мусора:

\r\e[0Klucid32\n\r\e[0Klucid64\n

Ответы [ 4 ]

1 голос
/ 15 ноября 2010

Какая оболочка?Некоторые не поддерживают массивы.

«Хлам», который вы видите, представляет собой управляющие коды терминала для перемещения курсора или раскраски текста и т. Д. Это, вероятно, код для очистки до конца строки.

Какая команда выводит эти символы?Некоторые команды автоматически отключают эти коды, когда их вывод идет не в tty.Другие имеют параметры командной строки, чтобы отключить это.Есть также утилиты, которые будут раздавать коды для вас.

1 голос
/ 15 ноября 2010

Попробуйте

boxes=(`mycommand list | xargs`)
1 голос
/ 15 ноября 2010

Как насчет этого (в bash):

boxes=(); while read l; do boxes+=("$l"); done < <(mycommand list)

Это поместит каждую строку вывода в отдельный элемент массива.При этом:

boxes=(); while read l; do boxes+=("$l"); done < <(mycommand list | tr "$IFS" '\n')

также будет разделять элементы на разделители параметров оболочки.Это разделит пробел:

boxes=(); while read l; do boxes+=("$l"); done < <(mycommand list | tr '[:space:]' '\n')

Это не так быстро, как некоторые другие решения, но вы можете контролировать, как лучше хранить элементы массива.

1 голос
/ 15 ноября 2010

Попробуйте с boxes=$(mycommand list | tr '\n' ' ')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...