Ich möchte Code in eine Datei drucken mit cat <<EOF >>
:
cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
curr=$((curr+406));
echo $curr > /sys/class/backlight/intel_backlight/brightness;
fi
EOF
Aber wenn ich die Dateiausgabe überprüfe, erhalte ich Folgendes:
!/bin/bash
curr=1634
if [ -lt 4477 ]; then
curr=406;
echo > /sys/class/backlight/intel_backlight/brightness;
fi
Ich habe versucht, einfache Anführungszeichen zu setzen, aber die Ausgabe enthält auch einfache Anführungszeichen. Wie kann ich dieses Problem vermeiden?
#!/bin/bash
und nichts anderes sein - das#!
macht sie zu einer gültigen Shebang-Zeile, und was danach kommt, ist der Weg zum Dolmetscher.man bash
und suchen nachHere Documents
. Alle Details dort.$(command)
anstelle von`command`
. Um den Inhalt einer Datei zu erhalten, hat Bash$(<file)
Antworten:
Sie brauchen nur eine minimale Änderung; Setzen Sie das Here-Document-Trennzeichen nach
<<
.oder gleichwertig Backslash-Escape:
Ohne Anführungszeichen wird das Dokument hier variabel ersetzt, Backticks werden ausgewertet usw., wie Sie festgestellt haben.
Wenn Sie einige, aber nicht alle Werte erweitern müssen, müssen Sie die Werte, die Sie verhindern möchten, einzeln umgehen.
wird herstellen
Wie von @fedorqui vorgeschlagen , ist hier der relevante Abschnitt von
man bash
:quelle
Oder Sie müssen Ihre EOF-Marker verwenden, um den anfänglichen Marker anzugeben, damit keine Erweiterung durchgeführt wird:
IHTH
quelle
Dies sollte funktionieren, ich habe es nur getestet und es hat wie erwartet funktioniert: Es fand keine Erweiterung, Substitution oder was-hast-du stattgefunden.
Die Verwendung der folgenden Funktionen funktioniert ebenfalls.
Es ist auch erwähnenswert, dass bei der Verwendung von Heredocs wie
<< EOF
Substitution und variable Expansion und dergleichen stattfindet. Also mache so etwas:führt immer zur Erweiterung der Variablen
$HOME
und$PWD
. Wenn sich Ihr Home-Verzeichnis/home/foobar
und der aktuelle Pfad befinden/home/foobar/bin
,file
sieht dies folgendermaßen aus:anstelle der erwarteten:
quelle
<<<
nur ab Bash 3 verfügbar und nicht auf andere Shells übertragbar.<<<
ist auch verfügbar in Zsh