bash-Frage: Schreiben per echo in Datei - Zeichen werden ausgelassen
Hallo, ich stehe mir wahrscheinlich mal wieder selbst auf der Leitung herum. Ich möchte aus einem Script heraus Zeilen in ein anderes Script hineinschreiben. Das mache ich normalerweise per echo 'bla text hier steht nix' > Zieldatei Soweit so gut. Jetzt muss ich aber Befehlszeilen aus einem Script in ein anderes schreiben, und da stehe ich vor ein paar Problemen. Will ich zum Beispiel die folgende Zeile übertragen: STATUS=`ls -al "$FILENAME" | awk '{print $5}'` wird daraus nach dem echo-Befehl folgende Zeile: STATUS=`ls -al "$FILENAME" | awk {print }` Wie bekomme ich die komplette Zeile übertragen? Möglichst in einem Rutsch, da ich einen Haufen Zeilen übertragen muss. Bin für jede Hilfe dankbar. mfG, Jens -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag, 15. Oktober 2007 13:15:19 schrieb Jens Nixdorf:
STATUS=`ls -al "$FILENAME" | awk '{print $5}'`
wird daraus nach dem echo-Befehl folgende Zeile:
STATUS=`ls -al "$FILENAME" | awk {print }`
Wie bekomme ich die komplette Zeile übertragen? Möglichst in einem Rutsch, da ich einen Haufen Zeilen übertragen muss. Bin für jede Hilfe dankbar.
Ich würde escapen vorschlagen (sehe ich das richtig, das du da wirklich die $5 stehen haben willst, nicht derren Inhalt? STATUS=`ls -al "$FILENAME" | awk '{print \$5}'` Grüße Michael
Hallo, Jens Nixdorf schrieb:
Hallo,
ich stehe mir wahrscheinlich mal wieder selbst auf der Leitung herum. Ich möchte aus einem Script heraus Zeilen in ein anderes Script hineinschreiben. Das mache ich normalerweise per
echo 'bla text hier steht nix' > Zieldatei
Soweit so gut. Jetzt muss ich aber Befehlszeilen aus einem Script in ein anderes schreiben, und da stehe ich vor ein paar Problemen. Will ich zum Beispiel die folgende Zeile übertragen:
STATUS=`ls -al "$FILENAME" | awk '{print $5}'`
wird daraus nach dem echo-Befehl folgende Zeile:
STATUS=`ls -al "$FILENAME" | awk {print }`
Wie bekomme ich die komplette Zeile übertragen? Möglichst in einem Rutsch, da ich einen Haufen Zeilen übertragen muss. Bin für jede Hilfe dankbar.
Wenn mich nicht alles täuscht muss man den Befehl, den man dem AWK übergibt, quoten damit dieser nicht durch die Shell gefressen wird. Also: STATUS=`ls -al "$FILENAME" | awk '{print $% }'` so müsste es passen (denk ich mal) Gruß Daniel
mfG, Jens
-- Daniel Spannbauer Systembetreuung marco Systemanalyse und Entwicklung GmbH Tel +49 8333 9233-27 Fax -11 Auf der Wies 8, D 87727 Babenhausen Mobil +49 171 4033220 http://www.marco.de/ Email ds@marco.de Geschäftsführer Martin Reuter HRB 68255 Amtsgericht München -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Jens Nixdorf wrote:
ich stehe mir wahrscheinlich mal wieder selbst auf der Leitung herum. Ich möchte aus einem Script heraus Zeilen in ein anderes Script hineinschreiben. Das mache ich normalerweise per
echo 'bla text hier steht nix' > Zieldatei
Soweit so gut. Jetzt muss ich aber Befehlszeilen aus einem Script in ein anderes schreiben, und da stehe ich vor ein paar Problemen. Will ich zum Beispiel die folgende Zeile übertragen:
STATUS=`ls -al "$FILENAME" | awk '{print $5}'`
wird daraus nach dem echo-Befehl folgende Zeile:
STATUS=`ls -al "$FILENAME" | awk {print }`
Wie bekomme ich die komplette Zeile übertragen? Möglichst in einem Rutsch, da ich einen Haufen Zeilen übertragen muss. Bin für jede Hilfe dankbar.
echo 'STATUS=`ls -al "$FILENAME" | awk '\''{print $5}'\''`' Andreas (tested on openSUSE 10.2) -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag, 15. Oktober 2007 schrieb Kyek, Andreas, VF-DE:
echo 'STATUS=`ls -al "$FILENAME" | awk '\''{print $5}'\''`'
Ha, das wars, danke! Escapen hatte ich schon versucht, aber dass ich dabei die \ auch extra quoten muss ist mir latürnich entgangen. mfG, Jens -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Jens Nixdorf wrote:
Am Montag, 15. Oktober 2007 schrieb Kyek, Andreas, VF-DE:
echo 'STATUS=`ls -al "$FILENAME" | awk '\''{print $5}'\''`'
Ha, das wars, danke! Escapen hatte ich schon versucht, aber dass ich dabei die \ auch extra quoten muss ist mir latürnich entgangen.
richtiges Ergebnis mit falscher Begründung! Was passiert: echo bekommt hier MEHRERE Strings nacheinander übergeben und gibt sie einfach aneinandergehängt aus. Ich teile sie dir mal auf: 1. 'STATUS=`ls -al "$FILENAME" | awk ' 2. \' 3. '{print $5}' 4. \' 5. '`' die beiden Sequenzen "\'" veranlassen die Ausgabe von jeweils EINEM "'"; das funktioniert aber NICHT innerhalb eines Strings, der von "'" eingeschlossen ist. Mach doch mal ein "echo \'" auf der Kommandozeile! Klar? Andreas -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Mon, 15 Okt 2007, Jens Nixdorf schrieb:
Soweit so gut. Jetzt muss ich aber Befehlszeilen aus einem Script in ein anderes schreiben, und da stehe ich vor ein paar Problemen. Will ich zum Beispiel die folgende Zeile übertragen:
STATUS=`ls -al "$FILENAME" | awk '{print $5}'`
wird daraus nach dem echo-Befehl folgende Zeile:
STATUS=`ls -al "$FILENAME" | awk {print }`
Klar. Fehlendes Quoting/Escapen. Neben der von Andreas vorgeschlagenen Lösung gibt es noch folgende, die v.a. bei mehreren Zeilen hilfreich ist: cat <<'EOF' >> datei STATUS=`ls -al "$FILENAME" | awk '{print $5}'` EOF Wichtig dabei sind die '' um das "EOF", die sagen der Bash, daß sie im folgenden Here-Dokument[1] nichts expandieren soll. Wenn du innerhalb des Here-Dokuments etwas ersetzt haben willst, dann mußt du die '' weglassen, allerdings auch die Dinge schützen, die die bash nicht expandieren soll (auch die ``). Wenn du also z.B. $FILENAME ersetzt haben willst: FILENAME="foo.txt" cat <<EOF >> datei STATUS=\`ls -al "$FILENAME" | awk '{print \$5}'\` EOF Achso, das "EOF" ist nur ne Konvention. HTH, -dnh [1] siehe man bash -> "Here Documents" zu den Details -- "Wirklich praxisnah wären Münzen zu EUR 0,99." -- Wolfgang Schwanke in de.etc.sprache.deutsch -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag, 15. Oktober 2007 schrieb David Haller:
cat <<'EOF' >> datei STATUS=`ls -al "$FILENAME" | awk '{print $5}'` EOF
Danke, das ist auch wieder so ein Tipp auf den ich nie gekommen wäre. Und auch Danke an die anderen Antworter. mfG, Jens -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (5)
-
Daniel Spannbauer
-
David Haller
-
Jens Nixdorf
-
Kyek, Andreas, VF-DE
-
Michael Skiba