Menü im Bashscript

Was steht in /tmp/menu.tmp.$$ und warum leitest Du den Fehler dahin um?
 
Hallo

Wenn du mit der PID-Nummer arbeitest, solltest du dir immer bewusst sein, dass dies eine flüchtige Variable ist.
Diese ist ja diejenige des aktuellen Prozesses.
UU. kann ein weiterer Aufruf eine ganz andere PID haben, wenn dieser Aufruf einen neuen Prozess startet.
Deshalb ist es erforderlich solche Werte in einer Variablen zu speichern.

Beispiel:
NUM=$$;
My_Tempfile=/temp/temp$NUM
...
Nun kannst du sicher auf die richtige Datei zugreifen, auch wenn dazwischen andere Prozesse gestartet werden.

Also schau mal nach, welche Temporären Dateien dein Skirpt erzeugt, und was da drin steht.

Wie Xanti schon sagte, ist da nur eine Fehlerausgabe zu erwarten.

Gruß Wolfgang
 
Hallo @all

Ich bin diesen weg gegangen.

Code:
#! /bin/bash

function wahl()
{
echo "Menupunkt 1"
}

function wahl2()
{
echo "Menupunkt2"
}

function save()
{
clear;
frage=
echo "'d' (Datensicherung) oder 'z' (Zurücklesen?) 'e' (Ende)"
read frage
    if [ -z $frage ]									
    then	
    $function save	
	elif [ "$frage" = "e" ]
        then	
        exit	
     elif [ "$frage" = "d" ]
     then
    $function datensave
	    elif [ "$frage" = "z" ]
    	    then
	    $function datenlesen
	    fi

}

function datensave()
{
if [ -d /datensicherung ]						
    then							
    echo;
    else							
    mkdir /datensicherung						
fi;

     clear;
        echo;
        echo "Zum Abbruch 'e' (Ende) eingeben!"
        echo;
	echo "Vorhandene Datensicherung :  "
        echo `ls /datensicherung`
        dverz=
        echo -e "bitte geben Sie das zu sichernde Verzeichnis ein!"
        read dverz
        if [ -z $dverz ]
	then
	exit;
	elif [ "$dverz" =  "e" ]
	then 
	exit;
	fi	
    datei=
    echo "Bitte nun den Namen für die Sicherungsdatei eingeben!"
    read datei
    tar -czvf /datensicherung/$datei.tgz $dverz # datensicherung von home in *.tgz
#	     tar -dzvf /datensicherung/$datei.tgz $dverz # verifizieren der Daten
    echo;
    echo "Die Sicherung von '$dverz' wurde in '/Datensicherung' erstellt!"
}

function datenlesen()
{
clear;
if [ -d /datensicherung ]						
   then							
        save=
        PS3="Welche Datensicherung zurücklesen?   "
        cd /datensicherung
	select save in *
        do echo $save
	break;
	done;
	tar -xzvf /datensicherung/$save         # wiederherstellen der gesicherten Daten
		else				
		echo "Das Verzeichnis ´/datensicherung´ existiert nicht!"
		echo "Der Vorgang wurde beendet."
fi;
}

clear;
if [ -w /etc/fstab ]								
then
echo;
    else 
    echo "Zur Ausführung muessen Sie als 'root' angemeldet sein!"
fi
										
echo "._______________________________________________________."
echo "|                                                       |"
echo "|        Dieses Programm unterstuetzt Sie               |"
echo "|                bla bla bla                            |"
echo "._______________________________________________________."
echo;
echo "Folgende Funktionen sind verfuegbar: "
echo;
echo;
    PS3="Waehlen Sie eine Funktion: "
echo;
    select auswahl in "menupunkt 1" "menupunkt 2" "Datensicherung" "Programm beenden"

    do echo

    case $auswahl in

		"menupunkt 1" ) wahl; break;;

		"menupunkt 2" ) wahl2; break;;
		
		"Datensicherung" ) save; break;;

		"Programm beenden" ) exit; break;;

		* ) echo "Ungueltige Auswahl";;
		# * ) programname; break;;           # hat neustart des Prog. bei Fehleingabe zur Folge		
    esac
    done
exit;

Ich hab im Moment nur keine Ahnung, wie ich die Funktion datenlesen ohne
Fehler beenden kann. Vielleicht kann man mir einer von Euch einen Tipp geben?

Gruß Lumpi

PS: Ich bin NEWBI und möchte Euch bitten, mich wegen eventuel umständlichen Elementen
zu zerfleischen :D
 
Nun, es kommt kein Fehler. *lach*
Soweit funktioniert das Prog ja.
aber wenn ich nun das zurücklesen nicht durchführen will, muß ich einen nicht im menu existierenden wert eingeben.
dann wird das prog fortgesetzt und endet natürlich in der Fehlermeldung

Code:
1) save.tgz
2) save2.tgz
3) save3.tgz
Welche Datensicherung zurücklesen?f

tar: /datensicherung/: Cannot read: Is a directory
tar: At beginning of tape, quitting now
tar: Error is not recoverable: exiting now

gzip: stdin: unexpected end of file
tar: Child returned status 2
tar: Error exit delayed from previous errors
Die Fehlermeldung mit Folgen geschieht daher, weil das Prog den String ´f´
nicht übergeben kann. schließlich existiert ja keine menuauswahl "f".

Ich möchte aber das zurücklesen in dem Moment beenden, wo ich
die aktuellen speicherstände sehe und den Prompt zur auswahl erhalte.

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt- :hilfe2:

Gruß Lumpi
 
Hallo,

ich sehe zwei Fehler:

choice=`cat /tmp/menu.tmp.$$`
rm -f /tmp/menu.tmp.$$
case choice="save" in
start)
$saveend
echo "Sicherung wurde durchgeführt"
;;
*)
esac
exit 0

Das obige case-Konstrukt ist syntaktisch falsch. Du meinst wahrscheinlich:

Code:
case "$choice" in
  save)
    archive;
    echo "Sicherung durchgeführt"
  ;;
  *)
    echo "Sicherung nicht durchgeführt"
  ;;
esac

Der zweite Fehler ist der Aufruf von $saveend. Hier musst Du Deine Sicherungsfunktion "archive" aufrufen.

Gruß
 
@Wolfgang,Xanti

In der temp Datei steht "save" drin, wie erwartet.
Das die beiden $$ für die PID Nr. stehen habe ich erst später realisiert, kann man auch anders machen, ich habe das aus einem Beispiel.

@phrenicus

Jetzt bekomme ich nur die Ausgabe "Sicherung nicht durchgeführt"
Wenn die Funktion so richtig ist:
Code:
archive() {
        read $saveend
        if [ '$archive' = 'save'] ; then
        echo "see if we already have a $NAME"
                if [ -e /var/files/$ZNAME ];
                then
                    echo "File exists I will remove it first .. Please wait"
                    rm /var/files/$NAME 2> /dev/null
        echo "saving in /var/files/$NAME"
        fi
        tar Pczf /var/files/$NAME \
        /etc/network/interfaces \
        /etc/config/*.cfg \
        /etc/config/*.config \
        /etc/config/*.log

        echo "Sicherung wurde durchgeführt"
fi
verstehe ich nicht warum das Script bei save die Funktion ausführt und eine Sicherung anlegt.

Ach und ist die Zeile "echo "Sicherung wurde durchgeführt" nicht überflüßig?
 
Chris,

Du liest mit read eine Variable ein, nicht aus:

Code:
read saveend
ohne $ (Zeile 2).

EDIT:
------------------
Dann liest Du in der nächsten Zeile die gleiche Variable aus:

Code:
if [ '$saveend' = 'save'] ; then
------------------

Dann ist in der Zeile

Code:
if [ -e /var/files/$ZNAME ]
wohl ein Z zuviel, weil ZNAME nirgends sonst vorkommt.

Ob die Ausgabe von "echo Sicherung durechgeführt" überflüssig ist, musst Du selbst wissen. Ich persönlich schreibe lieber nach einer Sicherung irgendetwas ins Logfile, wie beispielsweise:

Code:
logger "Die Sicherung wurde durchgeführt. Die gesicherte Datei 
/var/files/$NAME ist `stat -c %s /var/files/$NAME` Bytes groß."

Gruß.........
 
Zuletzt bearbeitet:
So nach einigen Tage des Nachdenkens, habe ich festgestellt das "start" in "save" geändert werden muß.
Dann ist die Ausgabe zumindest teils richtig:
Code:
./test: line 7: [: missing `]'
Sicherung wurde durchgeführt

Jetzt fehlt in Zeile 7 ein Zeichen aber wo?
Code:
7         if [ '$archive' = 'save'] ; then
 
Hallo,

ich würd jetzt mal so spontan sagen, dass die Hochkommas um $archive weg müssen...

Gruss
d22
 
Aus

Code:
if [ '$archive' = 'save'] ; then

mach

Code:
if [ '$archive' = 'save' ]; then

Leerzeichen beachten! Damit sollte der Fehler mit dem "missing ]" weg sein. Ausserdem hat dizzgo recht: die Hochkommas um $archive verhindern die Auswertung von $archive. Wenn Du gruppieren willst, dann mit "...".

Gruss, Xanti

p.s. 1000. Post :)
 
Chris,

pass auf die Leerzeichen auf:

Code:
if [ '$archive' = 'save'] ; then

hier fehlt nach dem 'save' ein Leerzeichen.

Außerdem solltest Du auf die Apostrophe achten. Die sind nicht das gleiche wie Hochkommata (also doppelte Anführungszeichen). Apostrophe verhindern auf der Shell jegliche Substitution, die Hochkommata interpretieren dagegen die Variablen (und Kommando-Substitutionen, FWIW).

Also, es sollte ingesamt heißen:

Code:
if [ "$archive" = "save" ] ; then

dann wird es gehen.

Gruß

EDIT:

@Xanti: Genau :-)
Und Gratulation zum 1000. Post :-)
 
Die Fehlerausgabe kommt nicht mehr.
Aber die Sicherung wird nicht wirklich ausgeführt und ich muß nach starten des scriptes einmal return drücken um irgend eine ausgabe zu bekommen.
Kann das sein das er die Funktion "archive" nicht wirklich ausführt?
 
Wie sieht Dein Skript mittlerweise aus? Hast Du schon mal ans debugen gedacht? Ruf das Skript mal so auf und poste den Output

Code:
bash -x -e skript
 
So hab noch einen wesentlichen Fehler gefunden:

Statt arcive muß hier choice rein!

Code:
if [ "$choice" = "save" ]; then

Sicherung wird angelegt juhu!

Jetzt ist nur noch das drücken der Returntaste und die If schleife,
da hakt es noch ein wenig.

@Xanti hier ist die Ausgabe:
Code:
++ uname -n
++ date +%Y%m%d%H
+ NAME=XXX_2006070313_config.tar.gz
+ whiptail --title Save_Config --menu 'Hi, this is a menu box. You can use this to\nsave the configuration\nChoose the one of them:' 10 40 4 save 'Saving the configuration' Beenden 'Beende das Menue'
++ cat /tmp/menu.tmp.1614
+ choice=save
+ rm -f /tmp/menu.tmp.1614
+ archive
+ read saveend

+ '[' save = save ']'
+ echo 'see if we already have a XXX_2006070313_config.tar.gz'
see if we already have a XXX_2006070313_config.tar.gz
+ '[' -e /var/files/XXX_2006070313_config.tar.gz ']'
+ tar Pczf /var/files/XXX_2006070313_config.tar.gz /etc/network/interfaces /etc/config/*.cfg /saru/config/application.cfg /etc/*.cfg /etc.log 
+ echo 'Sicherung wurde durchgeführt'
Sicherung wurde durchgeführt
+ echo 'Sicherung wurde durchgeführt'
Sicherung wurde durchgeführt
 

Ähnliche Themen

Nginx als Reverse Proxy für Nextcloud und Emby

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

HandbrakeCLI Shell Skript

Port generieren, wenn nicht dann

Zugriff auf Samba Fileserver Freigaben verweigert(Samba 4 Active Directory Domäne)

Zurück
Oben