Verlust der Zeilenumbruch nach Zuweisung des grep-Ergebnisses zu einer Shell-Variablen

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

Normalerweise zeigt grep jede Übereinstimmung in einer separaten Zeile an, wenn sie in der Befehlszeile ausgeführt wird. In den obigen Skripten verschwindet jedoch die neue Zeile, die jede Übereinstimmung trennt. Weiß jemand, wie die Newline erhalten werden kann?


quelle

Antworten:

105

Sie verlieren es nicht in der Aufgabe, sondern im Echo. Sie können dies deutlich sehen, wenn Sie:

echo "${out}"

Sie sehen einen ähnlichen Effekt mit dem folgenden Skript:

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

welche Ausgänge:

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

Und, für Ihre Frage irrelevant, aber ich möchte es trotzdem erwähnen, bevorzuge ich das Konstrukt $ () anstelle von Backticks, nur um den zusätzlichen Vorteil zu haben, dass Befehle verschachtelt werden können. So wird Ihre Skriptzeile:

out=$(grep apache README)

Das sieht vielleicht nicht anders aus (und ist es auch nicht), aber es ermöglicht komplexere Befehle wie:

lines_with_nine=$(grep $(expr 7 + 2) inputfile)
paxdiablo
quelle
2
Ich wusste nicht, dass du das mit $ () machen kannst ... lerne hier ständig etwas Neues.
Tanj
1
Sie können rechnen, ohne Ausdruck zu verwenden. Verwenden Sie einfach Doppelparens: $ ((7 + 2))
Barry Brown
Eigentlich könnte ich das von nun an mit all meinen Antworten versuchen - einen (nicht immer ganz) relevanten Ausschnitt für die Erziehung des Schwarms
anhängen
Guter Punkt, Barry, aber es war nur ein Beispiel für Verschachtelung - meine beispielbildenden Fähigkeiten scheinen sich mit dem Alter (und / oder Alkohol) verschlechtert zu haben :-).
Paxdiablo
Ich habe gerade selbst von der $ (()) - Sache erfahren.
Barry Brown
34

Setzen Sie $ in Anführungszeichen:

#!/usr/local/bin/bash
out=`grep apache README`
echo "$out";
Pesto
quelle
20

Durch das Zitieren von Variablen in Bash bleibt das Leerzeichen erhalten.

Zum Beispiel:

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

Da Zeilenumbrüche Leerzeichen sind, werden sie "entfernt".

Tanj
quelle
2

Kombinieren Sie andere Antworten zu einem Einzeiler:

echo "($(grep apache README))"
Paragbaxi
quelle