web-dev-qa-db-de.com

Erstellen einer Ausgabedatei mit mehrzeiligem Skript mit echo/linux

Versuch, ein kleines Skript zu erstellen, mit dem ein Teil ohne Änderungen in der Ausgabedatei aus dem Skript geschrieben werden kann (wie es ist)

text der Quelldatei

echo "
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&
" >> output.txt

Gewünschte Leistung:

yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0
echo"#${green}Installing packages${reset}#" &&

Was ich bekomme ist: 

yellow=^[[33m
bel=^G
red=^[[31m
green=^[[32m
reset=^[(B^[[m
echo"#${green}Installing packages${reset}#" &&

Mit CentOS 7 Minimal fresh install Wenn Sie nach einer Lösung suchen, die auf das gesamte Skript/den gesamten Text angewendet werden kann, ändert sich die Zeile pro Zeile nicht. Ich denke, dass auch sed verwendet werden kann ...

6
Zaza

Sie müssen den Backticks entkommen (`):

#!/bin/bash
echo "
yellow=\`tput setaf 3\`
bel=\`tput bel\`
red=\`tput setaf 1\`
green=\`tput setaf 2\`
reset=\`tput sgr0\`
" >> output.txt

Als Bonus:

Ich bevorzuge diese Methode für mehrzeilige:

#!/bin/bash
cat << 'EOF' >> output.txt
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
EOF
20
N1ckles

Verwenden Sie ein einfaches Anführungszeichen, um Erweiterungen zu verhindern:

echo '
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
' >> output.txt

Weitere Informationen finden Sie unter Unterschied zwischen Doppel- und Einfachzitat .


Wenn Ihr Text ein einfaches Anführungszeichen enthält, funktioniert das obige nicht. In diesem Fall wäre die Verwendung von hier doc sicherer. Zum Beispiel wird das Obige unterbrochen, wenn Sie eine Zeile einfügen: var='something'

Bei Verwendung eines Here-Dokuments wird es so aussehen:

cat >> output.txt <<'EOF'
yellow=`tput setaf 3`
bel=`tput bel`
red=`tput setaf 1`
green=`tput setaf 2`
reset=`tput sgr0`
var='something'
EOF
4
Jahid

Nur eine späte Ergänzung: 

Der Befehlecho 'string' >> outputist einfach und großartig. Möglicherweise erhalten Sie jedoch die Fehlermeldung "...: Permission denied" in Kombination mit Sudo.

Ich hatte kürzlich ein kleines Problem mit Sudo echo 'string \n other string \n' > /path/to/file

Was für mich am besten funktioniert hat:
printf "Line1\nLine2\nLine3" | Sudo tee --append /path/to/file

Es ist ein Extra, dass Sie die Zeichenkette tatsächlich auch in stdout drucken lassen, damit Sie sehen, was in die Datei geschrieben wurde.

0
Gergely M

Danke an chepner

Die beste Lösung, die ich gefunden habe, ist:

echo '
yellow=$(tput setaf 3)
bel=$(tput bel)
red=$(tput setaf 1)
green=$(tput setaf 2)
reset=$(tput sgr0)
echo"#${green}Installing packages${reset}#"
' >> output

Bei dieser Lösung wird der gesamte Text ohne Änderungen in die Ausgabedatei übertragen. Auch Farbdefinitionen funktionieren ohne Änderungen.

0
Zaza