Jak zachować podziały wierszy podczas przechowywania danych wyjściowych polecenia w zmiennej?


107

Używam powłoki bash w systemie Linux. Mam ten prosty skrypt…

#!/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

Jednak po uruchomieniu tego skryptu

./temp.sh

całe wyjście jest drukowane bez powrotu karetki / nowych wierszy. Nie jestem pewien, czy to sposób, w jaki przechowuję dane wyjściowe do $ TEMP, czy też samo polecenie echo.

Jak zapisać dane wyjściowe polecenia w zmiennej i zachować podziały wierszy / powroty karetki?


3
Są dobrze zachowane w zmiennej (z wyjątkiem ostatniej); to twoje echo jest zepsute. Zobacz mywiki.wooledge.org/BashPitfalls wpis nr 14
Charles Duffy,

1
również don'tprzechowywać commandsw variables. Usea functionzamiast tego
han solo

Odpowiedzi:


208

Cytuj swoje zmienne. Oto dlaczego:

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

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

Bez cudzysłowów powłoka zastępuje zawarte $TEMPw niej znaki (jednym z nich jest nowa linia). Następnie przed wywołaniem echopowłoki dzieli ten ciąg na wiele argumentów za pomocą Internal Field Separator(IFS) i przekazuje wynikową listę argumentów do echo. Domyślnie IFSjest ustawiony na białe spacje (spacje, tabulatory i znaki nowej linii), więc powłoka tnie $TEMPłańcuch na argumenty i nigdy nie widzi znaku nowej linii, ponieważ powłoka uważa go za separator, tak jak spację.


xdotool type "$myVar"nie działa. nadal wpisuje zawartość zmiennej bez nowych linii
azerafati

Co jeśli chcesz zrobić coś takiego FOO="$(echo $VAR)"; jak $VARprawidłowo cytujesz, gdy jest już w cudzysłowie?
weberc2,

@ weberc2 Wystarczy zacytować go ponownie: "$(echo "$VAR")". Tak, to dziwne analizowanie, ale najwyraźniej łatwiejsze dla muszli niż dla nas.
OJFord

3

Napotkałem ten sam problem, cytat pomoże

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def

2
Udzielenie odpowiedzi na pytanie prawie 5 lat później bez dodawania żadnych nowych szczegółów do poprzednich odpowiedzi lub dostarczenia nowego rozwiązania nie jest dobrym pomysłem; proszę unikać publikowania tego rodzaju odpowiedzi.
MAChitgarha

1
Uwielbiam precyzję twoich „prawie 5 lat”, @MAChitgarha, :)
Neil Gatenby
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.