Как сохранить разрывы строк при сохранении вывода команды в переменную?

104

Я использую оболочку bash в Linux. У меня есть этот простой сценарий ...

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

Однако когда я запускаю этот скрипт

./temp.sh

весь вывод печатается без символов возврата каретки / новых строк. Не уверен, так ли я сохраняю вывод в $ TEMP или в самой команде echo.

Как сохранить вывод команды в переменной и сохранить разрывы строк / возврат каретки?

Дэйв
источник
3
Они прекрасно сохраняются в переменной (кроме последней); это твое эхо сломано. См. Запись № 14 на mywiki.wooledge.org/BashPitfalls
Чарльз Даффи,
1
также don'tхранить commandsв variables. Useа functionвместо
хан соло

Ответы:

202

Цитируйте свои переменные. Вот почему:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

Без кавычек оболочка заменяет $TEMPсимволы, которые она содержит (один из которых является новой строкой). Затем перед вызовом echoоболочки эта строка разбивается на несколько аргументов с помощью Internal Field Separator(IFS) и передается полученный список аргументов в echo. По умолчанию для параметра IFSустановлено значение пробела (пробелы, табуляции и символы новой строки), поэтому оболочка разбивает вашу $TEMPстроку на аргументы и никогда не видит новую строку, потому что оболочка считает ее разделителем, как и пробел.

Джайпал Сингх
источник
xdotool type "$myVar"не работает. он все еще набирает содержимое переменной без новых строк
azerafati
Что, если вы хотите сделать что-то вроде FOO="$(echo $VAR)": как $VARправильно цитировать, когда это уже внутри кавычек?
weberc2
@ weberc2 Вы просто процитирую еще раз: "$(echo "$VAR")". Да, странно разбирать, но шеллам видимо проще, чем нам.
OJFord
3

Я столкнулся с той же проблемой, поможет цитата

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def
Боб
источник
2
Ответить на вопрос почти 5 лет спустя без добавления каких-либо новых деталей к предыдущему (-ым) ответу (-ям) или предоставления нового решения - не лучшая идея; пожалуйста, избегайте публиковать такие ответы.
МАЧитгарха,
1
Любящий точность ваших «почти 5 лет», @MAChitgarha, :)
Нил