2012-03-28 6 views
13

Kann ich ein Bash-Skript mit persistenten Variablenwerten erstellen?Variable im Bash-Skript, die den Wert seit der letzten Ausführung festhält

Zum Beispiel initialisiere ich eine Variable mit 0, wenn das Skript zum ersten Mal ausgeführt wird (während eines bestimmten Zeitlimits), und die Variable wird automatisch mit jeder Ausführung des Skripts erhöht.

+0

Schlüssel/Wert-Datenbank schreibt in Bash-Skript; https://github.com/damphat/kv-bash :) – damphat

Antwort

14

können Sie nicht, aber Sie können eine Datei verwenden, um es zu tun

#!/bin/sh 

# if we don't have a file, start at zero 
if [ ! -f "/tmp/value.dat" ] ; then 
    value=0 

# otherwise read the value from the file 
else 
    value=`cat /tmp/value.dat` 
fi 

# increment the value 
value=`expr ${value} + 1` 

# show it to the user 
echo "value: ${value}" 

# and save it for next time 
echo "${value}" > /tmp/value.dat 
3

Ich fürchte, Sie müssen den Zustand in einer Datei irgendwo speichern. Der Trick ist, es irgendwo zu setzen, wo der Benutzer schreiben kann.

yourscriptvar=0 

if [ -e "$HOME/.yourscriptvar" ] ; then 
    yourscriptvar=$(cat "$HOME/.yourscriptvar") 
fi 

# do something in your script 

#save it output the file 
echo $yourscriptvar > "$HOME/.yourscriptvar" 
+1

Hier ist ein bash-ism: 'yescriptvar = $ (<" $ HOME/.yourskriptvar ")'. Dokumentiert [hier] (http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution) –

+0

Ich mag es ... Ich werde das in meine Tasche von Bash Hackery legen. danke –

3

ich das gleiche Problem vor ein paar Tagen hatte, und ich habe mein eigenes Tool geschrieben, um die Arbeit zu tun, weil Es gibt keinen anderen Weg, etwas Ähnliches zu tun.

gvar ist ein reiner Bash-Schlüsselwertspeicher, in dem jeder Benutzer eine andere Datensammlung besitzt. Die Datensätze werden im Home-Verzeichnis des Benutzers gespeichert.

Hier ist sie die interessantesten Funktionen aus dem Quellcode:

get_variable() { 
    cat $FILE | grep -w $1 | cut -d'=' -f2 
} 

set_variable() { 
    echo $1=$2 >> $FILE 
} 

remove_variable() { 
    sed -i.bak "/^$1=/d" $FILE 
} 
+0

Huh. Man könnte meinen, dass für eine solche "Bibliothek" die Geschwindigkeit optimiert wäre. Zum Beispiel ist 'cat' unnötig, wenn Sie' grep' verwenden, da 'grep' bereits eine Datei als Argument annehmen kann. Außerdem frage ich mich, wie das in Parallelausführung gut funktionieren würde, wenn es nicht 'flock' oder so etwas verwendet. – Yeti

+0

@Yeti du bist völlig richtig, Gvar ist nur ein Spielzeug, das mein Problem gelöst hat, aber ich bin nicht weiter gegangen. Ich dachte ähnliche Dinge, auf die Sie hingewiesen haben. Vielen Dank. –

Verwandte Themen