ubuntuusers.de

Shell-Skript Werte speichern für einen neuen Aufruf

Status: Gelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

Chroman

Anmeldungsdatum:
1. Juli 2006

Beiträge: 568

Hi,

ich suche nach einer Möglichkeit, wie ein Shellskript einen Wert speichern kann, den es bei dem nächsten Aufruf (nach einer beliebigen Zeitpsanne) wieder zur Verfügung hat.

Prinzipieller Ablauf:

1. Skript wird aufgerufen 2. Skript liest Wert aus einer Datei ein und schreibt diese in eine Variable 3. Skript wird ausgeführt und rechnet mit der Variable 4. Skript schreibt das Ergebnis wieder in eine Datei, so dass es bei dem nächsten Aufruf wieder den Wert einlesen kann.

Ist sowas möglich?

Danke für eure Hilfe ☺

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Wir reden hier von einem skalaren WErt, oder? Und von der Bash?

Schreiben in Datei:

echo $VAR > <datei>

Lesen aus Datei:

VAR="$(< <datei>)"

<datei> ist ein Meta-Zeichen und muss durch den Pfad zur Datei ersetzt werden.

Chroman

(Themenstarter)

Anmeldungsdatum:
1. Juli 2006

Beiträge: 568

Hi Kinch,

danke für deine Antwort!

Ja wir reden von der Bash. Es muss nicht unbedingt eine Zahl sein, es könnte auch einfach mal ein String sein. Funktioniert das Ganze dann auch?

Sehe ich es richtig, dass ich immer nur einen Wert pro Datei speichern kann, da ich nicht Zeilenweise einlesen kann?

Danke ☺

Grüße

Lasall

Ehemalige
Avatar von Lasall

Anmeldungsdatum:
30. März 2010

Beiträge: 7723

Hi Chroman,

schaue dir mal das Builtin source an, siehe Bash Reference Manual 🇬🇧. Siehe auch bash und Folgelinks.

Gruss Lasall

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Chroman

Ja wir reden von der Bash. Es muss nicht unbedingt eine Zahl sein, es könnte auch einfach mal ein String sein. Funktioniert das Ganze dann auch?

Mit Skalar meinte ich keine Zahl, sondern eine Skalare Variable: http://de.wikipedia.org/wiki/Skalare_Variable

Du könntest ja auch Arrays, Maps etc pp speichern.

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:

Schreiben:

echo "VAR1=$VAR1" >> <datei>
echo "VAR2=$VAR2" >> <datei>
echo "VAR3=$VAR3" >> <datei>

Einlesen:

source <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.

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.

Chroman

(Themenstarter)

Anmeldungsdatum:
1. Juli 2006

Beiträge: 568

Hi Lasall, hi Kinch

danke für eure Hilfe! Damit komme ich weiter ☺

Grüße

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13175

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

Antworten |