разместить многострочный вывод внутри переменной

Я пишу скрипт на bash и хочу, чтобы он выполнял команду и обрабатывал каждую строку отдельно. Например:

LINES=$(df)
echo $LINES

он вернет весь вывод, преобразуя новые строки с пробелами.

пример:

если вывод должен был быть:

1
2
3

тогда я бы получил

1 2 3

как я могу поместить вывод команды в переменную, позволяющую новым строкам оставаться новыми строками, поэтому, когда я печатаю переменную, я получаю правильный вывод?


person ufk    schedule 03.01.2012    source источник


Ответы (2)


Обычно в bash $v в большинстве случаев напрашивается неприятность. Почти всегда вы имеете в виду "$v" в двойных кавычках.

LINES="`df`"     # double-quote + backtick
echo "$LINES"
OLDPATH="$PATH"
person kubanczyk    schedule 03.01.2012
comment
На самом деле ни присваивание переменной не требует кавычек, потому что результат раскрытия не разбивается на слова при присвоении переменной. Но они ничему не вредят, и легче натренировать свою мышечную память, чтобы просто печатать двойные кавычки вокруг всех расширений. - person Jan Hudec; 03.01.2012

Нет, не будет. $(something) удаляет только завершающие символы новой строки.

Расширение аргумента для эха разбивается на пробелы, а затем эхо объединяет отдельные аргументы с пробелом. Чтобы сохранить пробел, вам нужно снова процитировать:

echo "$LINES"

Обратите внимание, что присваивание не нужно заключать в кавычки; результат раскрытия не разбивается на слова в присваивании переменной и в аргументе case. Но его можно цитировать, и проще научиться просто всегда ставить кавычки.

person Jan Hudec    schedule 03.01.2012
comment
Уверены ли вы? Я получил ожидаемые результаты как раз с LINES=$(df); echo "${LINES}", возможно, IFS отличается в нашей среде. Тем не менее +1, поскольку $(df) лучше, чем одинарные обратные кавычки в ответе @kubanczyk - person nhed; 03.01.2012
comment
@nhed: Правильно ... присвоение переменной никогда не разделяется. Меня смутило сообщение об ошибке, которое оказалось исходящим от чего-то другого, когда я тестировал его здесь. - person Jan Hudec; 03.01.2012
comment
@nhed: $() предпочтительнее ``, потому что его легче увидеть и потому что его легче вложить. - person Jan Hudec; 03.01.2012
comment
@kubanczyk обратные галочки — это старая школа, во-первых, это неудобно для глаз (обратные галочки в двойных кавычках), во-вторых, это ограничивает ваши возможности. Встраивание 2 команд, например: echo $$ > /tmp/mypid; LINES=$(ps $(cat /tmp/mypid)); echo "${LINES}" работает ... то же самое с обратными кавычками не будет - person nhed; 03.01.2012