2016-09-22 4 views
2

Es gibt ein Shell-Skript (bash), das eine CSV-Datei nach Zeilen prüft, die keinem Muster entsprechen, und eine E-Mail mit den falschen Zeilen senden. Das funktioniert gut, aber während die falschen Zeilen kombinieren linux geben einen Zeilenumbruch, in der E-Mail gibt es keinen Zeilenumbruch. Also versuche ich \ r \ n als Zeilenumbruch zu senden, aber das hat keine Wirkung, perl oder bash lösche diesen \ n newline.Wie bekomme ich einen Zeilenumbruch in E-Mail von Shellscript?

ist hier ein minimaler Arbeits Skript als Beispiel:

SUBJECT="Error while parse CSV" 
TO="[email protected]" 
wrongLines=$(perl -ne 'print "Row $.: $_\r\n" if not /^00[1-9]\d{4,}$/' $file) 
MESSAGE="Error while parse following Lines, pattern dont match: \r\n $wrongLines" 
echo $MESSAGE |od -c 

Der Ausgang od ist:

0000000 E r r o r  w h i l e  p a r s 
0000020 e  f o l l o w i n g  L i n e 
0000040 s ,  p a t t e r n  d o n t 
0000060 m a t c h :  \ r \ n  R o w 
0000100 2 :  4 9 2 7 8 3 8 7 4 3  \r R 
0000120 o w  3 :  4 8 2 3 2 8 9 7 3 8 
0000140  \r \n 
0000143 

Aber was ist der Grund dafür, dass die \ n zwischen den Zeilen in dem od Ausgang gelöscht? Ich versuche auch \ x0D \ x0A statt \ r \ n aber das hilft auch nicht. Irgendwelche Vorschläge?

+2

Verwenden Sie weitere Anführungszeichen: 'echo" $ MESSAGE "'. Und du willst nicht '\ r'. –

+0

Vielleicht sollten Sie [die 'echo'-Handbuchseite] lesen (http://man7.org/linux/man-pages/man1/echo.1.html)? Oder verwenden Sie stattdessen ['printf'] (http://man7.org/linux/man-pages/man1/printf.1.html)? –

+0

@gniourf_gniourf Die Sequenz "\ r \ n" ist die Standardnebenzeile in vielen textbasierten Protokollen. –

Antwort

2

Ihr Problem ist, dass Sie keine Anführungszeichen verwenden!

Look:

$ a="A multi-line 
input 
variable" 
$ echo $a 
A multi-line input variable 
$ echo "$a" 
A multi-line 
input 
variable 
$ 

ohne Anführungszeichen, werden Sie Opfer von word splitting und filename expansion (nicht im Beispiel oben dargestellt) sein.

Auch das Hinzufügen \r oder \n (das heißt, wörtlich Backslash gefolgt von r oder n) geht gar nicht zu helfen.

Fazit: Zitiere jede variable Erweiterung! immer! (es sei denn, Sie wirklich bedeuten ein glob-Muster - in diesem Fall werden Sie auch einen Kommentar im Code hinzufügen, um zu erklären, warum Sie die Erweiterung absichtlich nicht zitieren).

Seitliche Anmerkung: don't use upper case variable names!

Es wird empfohlen, für Ihre eigenen Parameter Kleinbuchstaben zu verwenden, um sie nicht mit den von Bash internen Variablen und Umgebungsvariablen verwendeten Großbuchstaben zu verwechseln.

+0

Das einzig Seltsame war, dass die Zeile nach dem Text unterbrochen wird und vor der concat die Ausgabe einen Zeilenumbruch auch ohne das Zitat im echo-Befehl hat. – kockiren

Verwandte Themen