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?

shell 


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)

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";

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".


2

Kombinieren Sie andere Antworten zu einem Einzeiler:

echo "($(grep apache README))"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.