2012-04-20 10 views
5

Ho codice come questo, che elabora un file CSV:Perché i backslash spariscono quando si esegue echo?

#!/bin/bash 
while read line 
do 
    variable=$(echo $line | awk -F, '{print $2}') 
    echo $variable 
done < ./file.csv 

Se il file CSV contiene alcun \, quando si esegue questo comando, il testo di output non mostra il \.

Come posso garantire che lo \ non venga eliminato?

+0

Prova con virgolette doppie: '" $ (echo "$ riga" | awk -F, '{print $ 2}') "' – C2H5OH

+0

Questa è una barra rovesciata. Inizia dal basso. –

risposta

13

La ragione di questo comportamento è che il comando incorporato read utilizza \ come carattere di escape. Il flag -r disabilita questo comportamento.

Quindi, questo dovrebbe funzionare:

while read -r line 
    variable=$(echo $line | awk -F, '{print $2}') 
    echo $variable 
done < ./file.csv 

Si dovrebbe anche mettere "..." giro cose come $(...) e variabili, come

variable="$(command)" 
echo "$variable" 
+2

Inoltre, 'cut -d, -f2' può essere usato al posto di quel comando' awk'. – Zash

+0

Il tuo suggerimento 'read -r' funziona anche per la mia domanda opposta su come eliminare i cicli \ in while, quindi grazie! –

1

La pagina man per bash ha questo da dire su read:

Il carattere barra rovesciata (\) può essere utilizzata per rimuovere qualsiasi significato speciale per il prossimo carattere letto e per la linea di continuazione.

Problemi correlati