2012-04-02 5 views
3

Das klingt lächerlich einfach, und es ist mit anderen Shells. Aber ich kann nicht herausfinden, wie man Echo bekommt, um Zeilenumbrüche anzuzeigen. Zum Beispiel -Wie würden Sie Zeilenumbrüche in einen C-Shell-Befehl einfügen?

cat myFile 

zeigt die Datei, wie sie tatsächlich vorhanden ist, das ist, was ich will -

this 
is 
my 
file 

während mein Skript, das die folgenden enthält -

#!/bin/csh 
set var = `cat myFile` 
echo "$var" 

entfernt alle Zeilenumbrüche, die nicht das sind, was ich will -

this is my file 

Vielen Dank im Voraus.

+0

Versuchen Sie, Anführungszeichen hinzuzufügen, wenn Sie value zu var erfassen, d. H. 'Set var =" \ 'cat myFile \' "'. Viel Glück. – shellter

+0

Haben Sie Zugriff auf '/ bin/echo'? – cnicutar

+0

@shelter - Hatte es schon einmal versucht, hilft nicht. – WhyGeeEx

Antwort

6

Das Problem ist nicht mit dem Befehl echo, es ist mit csh die Handhabung von Backticks. Wenn Sie

set var = `cat myFile` 

die Zeilenumbrüche aus myfile auszuführen sind nie in $var gespeichert; Sie werden in Leerzeichen konvertiert. Ich kann mir keine Möglichkeit vorstellen, eine csh-Variable zu zwingen, Zeilenumbrüche aus einer Datei zu übernehmen, obwohl es eine Möglichkeit gibt, dies zu tun.

sh und seine Derivate verhalten sich so, wie Sie es möchten. Beispiel:

$ x="`printf 'foo\nbar'`" 
$ echo $x 
foo bar 
$ echo "$x" 
foo 
bar 
$ 

Die doppelten Anführungszeichen in der Zuweisung bewirken, dass die Zeilenumbrüche (mit Ausnahme des letzten) beibehalten werden. echo $x ersetzt die Zeilenumbrüche durch Leerzeichen, aber echo "$x" bewahrt sie.

Ihre beste Wette ist, etwas anderes zu tun, als zu versuchen, den Inhalt einer Datei in einer Variablen zu speichern. Sie haben in einem Kommentar gesagt, dass Sie versuchen, eine E-Mail mit dem Inhalt einer Protokolldatei zu senden. Füttern Sie den Inhalt der Datei also direkt mit dem von Ihnen verwendeten Mail-Befehl. Ich habe nicht alle Details, aber es könnte in etwa so aussehen:

(echo this ; echo that ; echo the-other ; cat myFile) | some-mail-command 

obligatorische Referenz: http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

1

Sie können awk verwenden, um jede Zeile mit ‚\ n‘ zu begrenzen, bevor die Schale Saiten sie zusammen.

set var = `cat myfile | awk '{printf("%s\\n", $0)'}` 

Angenommen, Ihr Befehl echo „\ n“ als Zeilenende-Zeichen interpretiert, echo ${var}cat myfile ohne die Notwendigkeit zusätzlicher Dateizugriff reproduzieren soll. Wenn der Newline-Code nicht erkannt wird, können Sie versuchen, das -e-Flag zum Echo hinzuzufügen und///bin/echo zu verwenden.

+0

Funktioniert in Tcsh, aber nicht Csh. –