Keine der obigen Antworten funktioniert, wenn Ihre Variable:
- beginnt mit
-e
- beginnt mit
-n
- beginnt mit
-E
- enthält einen
\
gefolgt von einemn
- darf kein zusätzlicher Zeilenumbruch angehängt werden
und daher kann man sich nicht auf sie für willkürliche Zeichenfolgeninhalte verlassen.
In Bash können Sie "here strings" verwenden als:
cat <<< "$var" > "$destdir"
Wie im Kommentar von Ash unten angemerkt, @Trebawas Antwort (formuliert im selben Raum wie meine!) mit printf
ist ein besserer Ansatz als cat
.
All dies funktioniert, muss aber auch ein Problem umgehen (Escapes und Sonderzeichen), das gar nicht erst auftreten muss:Sonderzeichen, wenn die Variable von der Shell erweitert wird. Tun Sie das (Variablenerweiterung) erst gar nicht. Verwenden Sie die Variable direkt, ohne Erweiterung.
Wenn Ihre Variable ein Geheimnis enthält und Sie dieses Geheimnis in eine Datei kopieren möchten, möchten Sie möglicherweise keine Erweiterung in der Befehlszeile haben, da die Ablaufverfolgung/das Befehlsecho der Shell-Befehle das Geheimnis preisgeben könnte. Also alle Antworten, die $var
verwenden in der Befehlszeile kann ein potenzielles Sicherheitsrisiko darstellen, da der Variableninhalt der Verfolgung und Protokollierung der Shell ausgesetzt wird.
Verwenden Sie für bereits exportierte Variablen Folgendes:
printenv var >file
Das bedeutet im Falle der OP-Frage:
printenv var >"$destfile"
Hinweis:Bei Variablennamen muss zwischen Groß- und Kleinschreibung unterschieden werden.
Warnung:Es ist keine gute Idee, eine Variable zu exportieren, nur um sie mit printenv zu drucken. Wenn Sie eine nicht exportierte Skriptvariable haben, die ein Geheimnis enthält, wird sie durch das Exportieren für alle zukünftigen untergeordneten Prozesse verfügbar gemacht (es sei denn, sie wird nicht exportiert, z. B. mit export -n
).
Verwenden Sie die echo
Befehl:
var="text to append";
destdir=/some/directory/path/filename
if [ -f "$destdir" ]
then
echo "$var" > "$destdir"
fi
Die if
testet das $destdir
repräsentiert eine Datei.
Die >
fügt den Text nach dem Abschneiden der Datei an. Wenn Sie nur den Text in $var
anhängen möchten zum vorhandenen Inhalt der Datei hinzufügen, dann verwenden Sie >>
stattdessen:
echo "$var" >> "$destdir"
Die cp
Der Befehl wird zum Kopieren von Dateien (in Dateien) verwendet, nicht zum Schreiben von Text in eine Datei.
echo
hat das Problem, dass wenn var
enthält so etwas wie -e
, wird es als Flag interpretiert. Eine weitere Option ist printf
, aber printf "$var" > "$destdir"
erweitert alle maskierten Zeichen in der Variablen, wenn also die Variable Backslashes enthält, stimmt der Dateiinhalt nicht überein. Da jedoch printf
nur umgekehrte Schrägstriche als Escapezeichen im Formatstring interpretiert, können Sie den %s
verwenden Formatbezeichner, um den genauen Variableninhalt in der Zieldatei zu speichern:
printf "%s" "$var" > "$destdir"