2009-04-16 2 views
52

Normalerweise Grep zeigt jede Übereinstimmung in einer separaten Zeile, wenn in der Befehlszeile ausgeführt. In den obigen Skripts verschwindet jedoch die neue Zeile, die jede Übereinstimmung trennt. Weiß jemand, wie die Newline erhalten werden kann?Verlieren von Newline nach dem Zuweisen von grep Ergebnis zu einer Shell-Variable

+0

möglich Duplikat [I nur eine Variable zugewiesen, aber echo $ variable zeigt etwas anderes] (http: // Stackoverflow .com/questions/29378566/i-nur-zugewiesen-eine-Variable-aber-Echo-Variable-zeigt-etwas-sonst-) –

+0

Es ist mehr ein Duplikat von [Capturing mehrere Zeilenausgabe zu einer Bash-Variable] (http: // stackoverflow.com/questions/613572/capturing-multiple-line-output-to-a-bash-variable) – Renato

Antwort

24

Put in Anführungszeichen $ out:

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

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

echo "${out}" 

Sie werden einen ähnlichen Effekt mit dem folgenden Skript sehen:

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

die Ausgänge:

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

Und irrelevant für Ihre Frage Aber ich möchte es trotzdem erwähnen, ich bevorzuge das Konstrukt $() anstatt Backticks, nur um die Befehle zu verschachteln. So Ihre Skriptzeile wird:

out=$(grep apache README) 

Jetzt, wo nicht anders aussehen kann (und es ist nicht), aber es macht möglich, komplexere Befehle wie:

lines_with_nine=$(grep $(expr 7 + 2) inputfile) 
+0

Ich wusste nicht, dass Sie das mit $() tun könnten ... lernen Sie die ganze Zeit etwas Neues Hier. – Tanj

+1

Sie können Mathe ohne expr verwenden. Benutze einfach double-parens: $ ((7 + 2)) –

+0

Eigentlich könnte ich das jetzt mit all meinen Antworten versuchen - füge ein (nicht immer total) relevantes Snippet für die Ausbildung des Schwarms hinzu :-) – paxdiablo

12

Variablen in der Bash Zitiert bewahrt die Leerzeichen .

Zum Beispiel:

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

da Zeilenumbrüche sind Leerzeichen sie "entfernt" get

Verwandte Themen