2009-04-16 10 views
52
#!/usr/local/bin/bash 
out=`grep apache README` 
echo $out; 

Di solito grep mostra ogni corrispondenza su una riga separata quando viene eseguita sulla riga di comando. Tuttavia, negli script di cui sopra, la nuova riga che separa ogni corrispondenza scompare. Qualcuno sa come la nuova riga può essere preservata?Perdita di una nuova riga dopo l'assegnazione del risultato di grep a una variabile di shell

+0

possibile duplicato di [ho appena assegnato una variabile, ma echo $ variabile mostra qualcos'altro] (http: // StackOverflow .com/questions/29378566/i-just-assigned-a-variable-but-echo-variable-shows-something-else) –

+0

È più un duplicato di [Cattura di output di più righe su una variabile bash] (http: // stackoverflow.com/questions/613572/capturing-multiple-line-output-to-a-bash-variable) – Renato

risposta

24

mettere $ out tra virgolette:

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

Lei non è perderlo nell'assegnazione ma l'eco. Si può vedere chiaramente se:

echo "${out}" 

Vedrete un effetto simile con il seguente script:

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

quali uscite:

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

E, irrilevante per la tua domanda ma mi piacerebbe menzionarlo comunque, preferisco usare il costrutto $() piuttosto che i backtick, solo per il vantaggio ulteriore di poter annidare i comandi. Così la vostra riga dello script diventa:

out=$(grep apache README) 

Ora che non può sembrare qualcosa di diverso (e non è), ma rende possibili comandi più complessi come:

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

Non sapevo che potessi farlo con $() ... impara qualcosa di nuovo tutto il tempo Qui. – Tanj

+1

Puoi fare matematica senza usare expr. Basta usare double-parens: $ ((7 + 2)) –

+0

In realtà potrei provarlo con tutte le mie risposte d'ora in poi - aggiungi uno snippet (non sempre totalmente) pertinente per l'educazione dello sciame :-) – paxdiablo

12

Citando variabili in bash conserva gli spazi .

Per esempio:

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

in quanto a capo sono spazi bianchi ottengono "rimossi"

Problemi correlati