2012-04-20 7 views
5

Ich habe Code wie diese, die eine CSV-Datei verarbeitet:Warum verschwinden Backslashes beim Ausführen von echo?

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

Wenn die CSV-Datei mit einem beliebigen \ enthält, wenn ich diesen Befehl ausführen, wird der Ausgabetext nicht die \ zeigen. Wie kann ich sicherstellen, dass \ nicht gelöscht wird?

+0

mit doppelten Anführungszeichen Versuchen: '" $ (echo "$ line" | awk -F, '{print $ 2}' '' – C2H5OH

+0

Das ist ein Backslash. Beginne von unten. –

Antwort

13

Der Grund für dieses Verhalten ist, dass der read builtin \ als Escape-Zeichen verwendet. Das Flag -r deaktiviert dieses Verhalten.

So sollte diese Arbeit:

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

Sie sollten auch "..." um Dinge platzieren wie $(...) und Variablen, wie

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

Außerdem kann 'cut -d, -f2' anstelle des Befehls 'awk' verwendet werden. – Zash

+0

Dein 'read -r'-Vorschlag funktioniert auch für meine umgekehrte Frage, wie man die \ in while-Schleifen löscht, also danke! –

1

Die Manpage bash hat dies über read zu sagen:

Der Backslash (\) eine besondere Bedeutung für das nächste Zeichen verwendet werden kann, lesen Fortsetzung und für Zeile zu entfernen.