Variable nach Scriptausführung speichern

oyster-manu

oyster-manu

toast
Hallo.

Ich will den Wert der Variable NEW_X mit der Wert der Variablen OLD_X vergleichen. Beim ersten Skriptaufruf wird NEW_X der selbe Wert wie OLD_X zugewiesen. Beim zweiten Aufruf des Skripts wird der Wert von NEW_X geändert und soll nun mit OLD_X verglichen werden.

Meine erste Idee ist, die Variablen NEW_X und OLD_X zu exportieren damit die Werte nicht verloren gehen. Allerdings habe ich dann zwei Variablen auf die ich systemweit zugreifen kann, was etwas übertrieben ist (ich brauche sie ja nur für dieses Skript).
 
Hi,

wie waer's mit einfach in eine Datei schreiben? Je nachdem wie lange du den Wert behalten willst z.B. unter /tmp oder /var/tmp?

Edit:
Nebenbei, mit "export" machst du eine Variable nicht systemweit lesbar, sondern sorgst nur dafuer dass die Variable an alle gestarteten Sub-Shells weitergegeben wird. Vielleicht meintest du das ja auch.

mfg,
bytepool
 
Zuletzt bearbeitet:
Hi,

wie waer's mit einfach in eine Datei schreiben? Je nachdem wie lange du den Wert behalten willst z.B. unter /tmp oder /var/tmp?

Edit:
Nebenbei, mit "export" machst du eine Variable nicht systemweit lesbar, sondern sorgst nur dafuer dass die Variable an alle gestarteten Sub-Shells weitergegeben wird. Vielleicht meintest du das ja auch.

mfg,
bytepool

Andere Möglichkeiten als eine externe Datei anzulegen gibts nicht?

Zu "export": also würde ich auf die Variable nicht mehr zugreifen können, wenn ich das Skript öfter mit cron ausführe?
 
Nein, andere Möglichkeiten ausser die Daten extern abzulegen gibt es nicht. Muss nicht unbedingt eine Datei sein, ist aber das einfachste. Auch export würde so nicht funktionieren (s.o.)
 
Komplizierter wäre das ganze in einer Datenbank zu speichern, LDAP, etc.. Irgendwas zum Persistieren wirst du brauchen. Datei ist das einfachste und das würde ich auch so machen.

Frage: Wozu das ganze?
 
das würde mich auch mal interessieren. wieso muss das script zweimal mit verschiedenen werten aufgerufen werden.

du könntest ${NEW_X:=Wert1} verwenden. und dann das script mittels export NEW_X=wert2 beim zweitern druchlauf starten. beim ersten durchlauf ohne export starten, dann wird wert1 benutzt. aber so richtig kapier ich nicht was das soll.
 
Konkret sieht mein Problem so aus:

Code:
#!/bin/bash

## checks the external IP of your system by using cURL

FILE="${HOME}/.EXTERNAL_IPs.log"
BACKUP_FILE="${HOME}/.EXTERNAL_IPs.log.bak"

CURL_PATH=$(echo -n `which curl` -s)

DATE=$(date +%Y.%m.%d)
TIME=$(date +%H:%M:%S)

# where to get the external IP from
URL="http://checkip.dyndns.org/"

#get the IP from the web
IP=$(${CURL_PATH} ${URL} | grep Address | cut -c19-)

LAST_IP=$IP

# format the output
OUTPUT=$(echo -e "${DATE}\t${TIME}\t${IP}")

# create files if they don't exist
if [ ! -f ${FILE} ]; then
	touch ${FILE}
	touch ${BACKUP_FILE}
	echo -e "# This log-file is created by the script log_my_ip.sh" >> ${FILE}
	echo -e "# Date\t\tTime\t\tIP-Address\n" >> ${FILE}
	echo -e "# This log-file is created by the script log_my_ip.sh." >> ${BACKUP_FILE}
	echo -e "# Date\t\tTime\t\tIP-Address\n" >> ${BACKUP_FILE}
fi

# print date, time and IP to log-file
if [ ! -z ${IP} ]; then  # are you online?
	if [ "${IP}" != "${LAST_IP}" ]; then # is it a new IP?
		echo -e "${OUTPUT}" >> ${FILE}
		echo -e "${OUTPUT}" >> ${BACKUP_FILE}
	fi
fi
exit 0

Das Skript speichert IPs in einem Log mit Datum- und Zeitstempel. Wenn die neue IP gleich der alten ist, soll kein neuer Eintrag in den log erfolgen. Das Skript funktioniert wie es hier angegeben wurde natürlich nicht, da LAST_IP = IP gesetzt wurde. Das muss ich noch ändern.
Das Skript wird jede Minute per cron ausgeführt, daher muss ich die LAST_IP irgendwo speichern um sie beim erneuten ausführen mit der neuen IP vergleichen zu können.

PS: Das Skript ist hier entstanden: http://www.unixboard.de/vb3/showthread.php?t=43458
 
Du kannst doch die letzte IP-Adresse aus deinem Logfile holen, etwa so
Code:
LAST_IP=$(tail -1 $FILE | sed -e 's/.*\t//')
oder einfach prüfen, ob die aktuelle Adresse schon als letzte drin steht, d.h. statt der Prüfung, ob $IP = $LAST_IP ist, checken, ob
Code:
if tail -1 $FILE | grep "    $IP$" >/dev/null; then
(TAB vor dem $IP) ...
 
Pfft... Viel einfacher:
Endlosschleife und sleep. Dann hast du halt eine Art Bash-Demon. (Du müsstest dann natürlich das Skript in den Hintergrund starten. Fertig. Evtl. noch per cron regelmäßig prüfen, ob es noch aktiv ist.
 
Naja, ob es wirklich "viel einfacher ist", eine Endlosschleife mit sleep, ein Startskript und einen cron-Job aufzusetzen, der prüft, ob die Endlosschleife nicht schon geendet hat, anstatt eine Zeile anzupassen, um Daten aus einer Datei zu lesen, die sowieso geschrieben werden soll, hängt m.E. doch stark davon ab, wie man "einfach" definiert ;)

Aber nichts für ungut ...
 
*g*
Nee, das nicht. Muss man aber auch mal gemacht haben. :-) Naja in der Minimalkonfiguration Endlosschleife ist's schon einfacher.
 

Ähnliche Themen

Befehl beim Session beenden

zpool 'vergessen'

Kopieren von Dateien per Shell

Wie kann ich pro Aufruf die jeweils nächste Zeile einer Datei auslesen?

SATA RAID Controller 3Ware / LSI / Adaptec

Zurück
Oben