Utrata znaku nowej linii po przypisaniu wyniku grep do zmiennej powłoki

80
#!/usr/local/bin/bash
out=`grep apache README`
echo $out;

Zwykle grep wyświetla każde dopasowanie w osobnym wierszu, gdy jest uruchamiany w wierszu poleceń. Jednak w powyższych skryptach znak nowej linii oddzielający każde dopasowanie znika. Czy ktoś wie, jak można zachować nową linię?


źródło

Odpowiedzi:

105

Nie tracisz go w zadaniu, ale w echu. Możesz to wyraźnie zobaczyć, jeśli:

echo "${out}"

Podobny efekt zobaczysz w następującym skrypcie:

x="Hello,
I
am
a
string
with
newlines"
echo "====="
echo ${x}
echo "====="
echo "${x}"
echo "====="

które wyjścia:

=====
Hello, I am a string with newlines
=====
Hello,
I
am
a
string
with
newlines
=====

I nie ma to związku z twoim pytaniem, ale i tak chciałbym o nim wspomnieć, wolę używać konstrukcji $ () zamiast znaków odwrotnych, tylko dla dodatkowej korzyści, jaką jest możliwość zagnieżdżania poleceń. Więc twoja linia skryptu staje się:

out=$(grep apache README)

To może nie wyglądać inaczej (i nie jest), ale umożliwia bardziej złożone polecenia, takie jak:

lines_with_nine=$(grep $(expr 7 + 2) inputfile)
paxdiablo
źródło
2
Nie wiedziałem, że możesz to zrobić z $ () ... cały czas ucz się tutaj czegoś nowego.
Tanj
1
Możesz wykonywać obliczenia matematyczne bez użycia wyrażeń. Po prostu użyj podwójnych parens: $ ((7 + 2))
Barry Brown
Właściwie mógłbym spróbować tego ze wszystkimi moimi odpowiedziami od teraz - dołącz (nie zawsze całkowicie) odpowiedni fragment dla edukacji roju :-)
paxdiablo
Słuszna uwaga, Barry, ale to był tylko przykład zagnieżdżania się - moje umiejętności tworzenia przykładów pogorszyły się z wiekiem (i / lub alkoholem :-).
paxdiablo
Właśnie dowiedziałem się o rzeczy $ (()).
Barry Brown
34

Umieść $ w cudzysłowie:

#!/usr/local/bin/bash
out=`grep apache README`
echo "$out";
pesto
źródło
20

Cytowanie zmiennych w bashu zachowuje białe znaki.

Na przykład:

#!/bin/bash
var1="A B  C   D"
echo $var1   # A B C D
echo "$var1" # A B  C   D

ponieważ nowe linie są spacjami, są „usuwane”

Tanj
źródło
2

Łączenie innych odpowiedzi w jedną wkładkę:

echo "($(grep apache README))"
paragbaxi
źródło