Kinch schrieb:
Chroman
Sehe ich es richtig, dass ich immer nur einen Wert pro Datei speichern kann, da ich nicht Zeilenweise einlesen kann?
Jein. Der Ansatz funktioniert tatsächlich erstmal nur für eine Skalare Variable. Natürlich kann man das auch für Beliebig erweitern. Der einfachse Weg dafür, wäre gutes altes Eval:
Nur, dass Dein Beispiel kein eval
enthält. ☺
Schreiben:
echo "VAR1=$VAR1" >> <datei>
echo "VAR2=$VAR2" >> <datei>
echo "VAR3=$VAR3" >> <datei>
Vorsicht: damit wird die Datei immer größer. Zumindest der erste echo
sollte ">|" nutzen, um die Datei vor dem Schreiben abzuschneiden. Effizienter ist allerdings m.E., die Datei nur einmal zu öffnen, z.B.:
{
echo "VAR1='$VAR1'"
echo "VAR2='$VAR2'"
echo "VAR3='$VAR3'"
} >|<datei>
Ach ja, man sollte auch noch an das Quoting denken, damit nicht so etwas passiert:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | $ dash x.sh
total 2
-rw-r--r-- 1 rklemme Domain Users 15 Mar 29 09:26 d
-rw-r--r-- 1 rklemme Domain Users 96 Mar 29 09:25 x.sh
$ cat x.sh
# ein Wert mit Leerzeichen
VAR1='123 ls -l'
# schreiben
echo "VAR1=$VAR1" >|d
# lesen
. ./d
$ cat d
VAR1=123 ls -l
|
Da ginge aber auch noch
cat <<CONFIG >|<datei>
VAR1='$VAR1'
VAR2='$VAR2'
VAR3='$VAR3'
CONFIG
Einlesen:
source <datei>
Genau, oder Old School
. <datei>
Aber der Ansatz ist nicht immer empfehlenswert. Es geht auch darum, was du machen willst. Wenn du zum Beispiel gar nicht die Menge der zu schreibenen Variablen weißt, wäre es empfehlender gleich ein Array zu serialisieren.
Wenn es komplizierter wird, empfiehlt es sich sowieso auf eine ordentliche Skriptsprache umzusteigen, die vernünftige Datentypen hat und das Definieren neuer Typen erlaubt. Da gibt es dann noch ganz andere Möglichkeiten der Serialisierung von Zustand.
Außerdem, da ich dem armen Lysander schonmal die Woche die Zehnnägel habe rotieren lassen: Das „source...“ von dynamisch generierten Dateien ist eine potentielle Sicherheitslücke. Wenn das Skript zum Beispiel als Root läuft und du das in /tmp speicherst, etc pp.
Guter Punkt! Dann sollte man eine passende umask
setzen.
Ciao
robert