Як зберегти розриви рядків при зберіганні виводу команди до змінної?


107

Я використовую оболонку 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
Вони добре збережені у змінній (за винятком останньої); це твоє відлуння порушене. Дивіться запис mywiki.wooledge.org/BashPitfalls # 14
Чарльз Даффі

1
також don'tзберігайте commandsв variables. Usea functionзамість цього
han solo

Відповіді:


208

Процитуйте свої змінні. Ось чому:

$ 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 років, не додаючи жодних нових деталей до попередніх відповідей або надання нового рішення, - це не гарна ідея; будь ласка, уникайте розміщення таких відповідей.
MAChitgarha

1
Люблю точність ваших "майже 5 років", @MAChitgarha, :)
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.