• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

BashSkript springt in der Funktion nicht zurück

bis11

Newbie
Hallo,

ich habe ein Bashskript geschrieben. Ich möchte gerne zwischen zwei Menüs hin und her springen, die mit dem Programm dialog erstellt wurden. Hier die beiden Funktionen :

Code:
function Bespielen {
  clear
  mainmenu=cat /gavisrc/mainmenu.txt 2> $tempfile
  echo $mainmenu
  retval=$?
  choice=`cat $tempfile`
  case $retval in
    0)
      case $choice in
        DESKTOP)
          OSDesktop
        ;;
        LAPTOP)
          OSLaptop
        ;;
        SONDER)
          SonderImages
        ;;
        AD)
          ADImages
        ;;
        INFOS)
          Infos
        ;;
        BASH)
          clear
          echo "***************************************************************************"
          echo "*                                                                         *"
          echo "* Mit dem Befehl --> 'sh /gavisrc/menubox.s' starten Sie das Menue erneut *"
          echo "*                                                                         *"
          echo "***************************************************************************"
          echo
          exit 0
        ;;
        NEUSTART)
          clear
          /etc/init.d/reboot
        ;;
      esac
    ;;
    1)
      /etc/init.d/reboot
    ;;
    255)
      /etc/init.d/reboot
    ;;
  esac
clear
}

function OSDesktop {
  clear
  desktopmenu=cat /gavisrc/stgdesk.txt 2> $tempfile
  echo $desktopmenu
  retval=$?
  choice=`cat $tempfile`
  case $retval in
    0)
      case $choice in
        FSCP300)
          img rp $imgserver //$imgserver/$imgpath/$desktop1
          /etc/init.d/reboot
        ;;
        FSCP30040GB)
          img rp $imgserver //$imgserver/$imgpath/$desktop2
          /etc/init.d/reboot
	      ;;
        FSCP300I845)
          img rp $imgserver //$imgserver/$imgpath/$desktop3
          /etc/init.d/reboot
	      ;;
        FSCP320I915)
          img rp $imgserver //$imgserver/$imgpath/$desktop6
          /etc/init.d/reboot
	      ;;
        FSCL20GB)
          img rp $imgserver //$imgserver/$imgpath/$desktop4
          /etc/init.d/reboot
	      ;;
        FSCLi815)
          img rp $imgserver //$imgserver/$imgpath/$desktop5
          /etc/init.d/reboot
	      ;;
      esac
    ;;
    1)
      Bespielen
    ;;
    255)
      Bespielen
    ;;
  esac
clear
}

Die beiden Textdateien sind definitiv in dem Verzeichnis, da beim Direktaufruf der Funktionen im Skript die Funktionen sehr gut funktionieren.
Der Aufbau der Textdateien sieht wie folgt aus :
mainmenu.txt
Code:
dialog --clear --title "Imaging - Menue" \
       --backtitle "Installation GaVI mbH" \
       --menu "" 14 68 7 \
       "DESKTOP" "Desktop-Images nur mit dem Betriebssystem" \
       "LAPTOP" "Laptop-Images nur mit dem Betriebssystem" \
       "SONDER" "Sonder-Images fuer Sonderinstallationen" \
       "AD" "AD-Images fuer den Aussendienst" \
       "INFOS" "Informationen ueber die Hardware" \
       "BASH" "Eingabeaufforderung" \
       "NEUSTART" "Rechner neu starten"
stgdesk.txt
Code:
dialog --clear --title "Images mit Betriebssystem fuer Desktop" \
       --backtitle "Installation GaVI mbH" \
       --menu "" 13 68 6 \
       "FSCP300" "FSC-P300/320 i865 Chipsatz und 80GB HDD" \
       "FSCP30040GB" "FSC-P300 i865 Chipsatz und 40GB HDD" \
       "FSCP300I845" "FSC-P300 i845 Chipsatz und 80GB HDD" \
       "FSCP320I915" "FSC-P320 i915 Chipsatz und 80GB HDD" \
       "FSCL20GB" "FSC L i845 Chipsatz und 20GB HDD" \
       "FSCLi815" "FSC L i815 Chipsatz und 20GB HDD"
Wenn ich jetzt vom Menü OSDesktop zurückspringen will in das Mainmenu, springt er immer in die Bash.
Wo liegt der Fehler in meiner Funktion OSDesktop ?
 

admine

Ultimate Guru
Ich würde in der case-Anweisung auf jeden Fall noch einen Eintrag für
*)
ergänzen.
Somit werden alle Eingaben abgefangen.
 
OP
B

bis11

Newbie
OSDesktop wird durch die Funktion Bespielen aufgeruft. Die Funktion Bespielen wird beim starten vom gesamten Script aufgerufen, nachdem ein paar Variablen gesetzt wurden.
 

abgdf

Guru
Hallo,

könntest Du das Skript bitte so posten, daß es überhaupt irgendwas macht, wenn man es aufruft ?
Ich bin immer so demotiviert, mir Code anzuschauen, wenn ich nicht erst mal sehen kann, was der überhaupt soll.

Gruß
 
OP
B

bis11

Newbie
Ich mache hier mal ein Beispiel-Skript, welches den gleichen Fehler wie mein richtiges Skript produziert.

Code:
#!/bin/bash
#
##############################################
export imgserver="......"
export imgpath="........"
export desktop1="............"
u.s.w.

##############################################
function Bespielen {
  clear
  mainmenu=cat /gavisrc/mainmenu.txt 2> $tempfile
  echo $mainmenu
  retval=$?
  choice=`cat $tempfile`
  case $retval in
    0)
      case $choice in
        DESKTOP)
          OSDesktop
        ;;
        BASH)
          clear
          echo "***************************************************************************"
          echo "*                                                                         *"
          echo "* Mit dem Befehl --> 'sh /gavisrc/menubox.s' starten Sie das Menue erneut *"
          echo "*                                                                         *"
          echo "***************************************************************************"
          echo
          exit 0
        ;;
        NEUSTART)
          clear
          /etc/init.d/reboot
        ;;
      esac
    ;;
    1)
      /etc/init.d/reboot
    ;;
    255)
      /etc/init.d/reboot
    ;;
  esac
clear
}

function OSDesktop {
  clear
  desktopmenu=cat /gavisrc/stgdesk.txt 2> $tempfile
  echo $desktopmenu
  retval=$?
  choice=`cat $tempfile`
  case $retval in
    0)
      case $choice in
        FSCP300)
          img rp $imgserver //$imgserver/$imgpath/$desktop1
          /etc/init.d/reboot
        ;;
        FSCP30040GB)
          img rp $imgserver //$imgserver/$imgpath/$desktop2
          /etc/init.d/reboot
         ;;
        FSCP300I845)
          img rp $imgserver //$imgserver/$imgpath/$desktop3
          /etc/init.d/reboot
         ;;
        FSCP320I915)
          img rp $imgserver //$imgserver/$imgpath/$desktop6
          /etc/init.d/reboot
         ;;
        FSCL20GB)
          img rp $imgserver //$imgserver/$imgpath/$desktop4
          /etc/init.d/reboot
         ;;
        FSCLi815)
          img rp $imgserver //$imgserver/$imgpath/$desktop5
          /etc/init.d/reboot
         ;;
      esac
    ;;
    1)
      Bespielen
    ;;
    255)
      Bespielen
    ;;
  esac
clear
}
######################################################################
# Main Procedure
######################################################################
: ${DIALOG=dialog}

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
#trap "rm -f $tempfile" 0 1 2 5 15

# Die Netzwerkkarte auf 100MBit/Vollduplex stellen
ethtool -s eth0 speed 100 duplex full autoneg off

# Starten des Main-Menues
Bespielen

So, das ist mein Skript. Aus dem zweiten Menü "OSDesktop" kann ich nicht zurückspringen in mein Hauptmenu, welches in der Funktion "Bespielen" dargestellt wird. Ich nutze die Textdateien aus meinem ersten Beitrag.
 

abgdf

Guru
Ok, Du willst Deine txt-Dateien (mit den dialog-Befehlen) doch ausführen. Dann müssen sie ausführbar sein (chmod +x *txt). Probiere dann auch mal, ob in der Konsole z.B. "./mainmenu.txt" klappt.

Dann gehen die Menüs (jedenfalls mit DESKTOP zum zweiten Menü) mit folgenden Hacks in Deinem Skript:

Code:
#!/bin/bash
#
##############################################
export imgserver="......"
export imgpath="........"
export desktop1="............"

##############################################
function Bespielen {
  # clear
  mainmenu=cat mainmenu.txt 2>$tempfile
  $mainmenu
  retval=$?
  choice=`cat $tempfile`
  case $retval in
    0)
      case $choice in
        DESKTOP)
          OSDesktop
        ;;
        BASH)
          # clear
          echo "***************************************************************************"
          echo "*                                                                         *"
          echo "* Mit dem Befehl --> 'sh /gavisrc/menubox.s' starten Sie das Menue erneut *"
          echo "*                                                                         *"
          echo "***************************************************************************"
          echo
          exit 0
        ;;
        NEUSTART)
          clear
          /etc/init.d/reboot
        ;;
      esac
    ;;
    1)
      # /etc/init.d/reboot
    ;;
    255)
      # /etc/init.d/reboot
    ;;
  esac
# clear
}

function OSDesktop {
  clear
  desktopmenu=cat stgdesk.txt 2>$tempfile
  $desktopmenu 
  retval=$?
  choice=`cat $tempfile`
  case $retval in
    0)
      case $choice in
        FSCP300)
          img rp $imgserver //$imgserver/$imgpath/$desktop1
          /etc/init.d/reboot
        ;;
        FSCP30040GB)
          img rp $imgserver //$imgserver/$imgpath/$desktop2
          /etc/init.d/reboot
         ;;
        FSCP300I845)
          img rp $imgserver //$imgserver/$imgpath/$desktop3
          /etc/init.d/reboot
         ;;
        FSCP320I915)
          img rp $imgserver //$imgserver/$imgpath/$desktop6
          /etc/init.d/reboot
         ;;
        FSCL20GB)
          img rp $imgserver //$imgserver/$imgpath/$desktop4
          /etc/init.d/reboot
         ;;
        FSCLi815)
          img rp $imgserver //$imgserver/$imgpath/$desktop5
          /etc/init.d/reboot
         ;;
      esac
    ;;
    1)
      Bespielen
    ;;
    255)
      Bespielen
    ;;
  esac
}
######################################################################
# Main Procedure
######################################################################
: ${DIALOG=dialog}

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
#trap "rm -f $tempfile" 0 1 2 5 15

# Die Netzwerkkarte auf 100MBit/Vollduplex stellen
# ethtool -s eth0 speed 100 duplex full autoneg off

# Starten des Main-Menues
Bespielen

Den Rest des Skripts habe ich aber nicht geprüft, also bitte benutze so weit wie möglich Deinen eigenen Code.

Gruß
 
OP
B

bis11

Newbie
Das Problem, warum das Skript nicht funktioniert hat, lag an den cat-Aufrufen. Ich habe diese mal weggelassen und die Textdatei direkt aufgerufen, dann hat es funktioniert.
 

abgdf

Guru
Wenn Dein Skript aufgrund dieses Threads jetzt funktioniert, denke ich schon, daß sich die Leute, die sich hier mit Deinem Code auseinandergesetzt haben, auch ein Dankeschön verdient hätten.

Gruß
 

Asem

Newbie
Die cats müssen zumindest in Backquotes gesetzt werden, damit dabei was sinnvolles rumkommt.

Und was soll in OSDesktop eigentlich in der inneren Schleife ausgewählt werden? Ich kann mir nicht vorstellen, dass ein cat jemals Ausdrücke wie FSCP300 auf STDERR ausgeben würde.

Außerdem ist die Programmierung ziemlich schräg, da die Funktion OSDesktop die Funktion Bespielen aufruft und diese wiederum zurück in OSDesktop springen kann (Ein Funktionsaufruf ist kein GOTO). Nicht, dass die bash mit solcherart Rekursion nicht klarkäme, aber da die Auswahl im case allein durch Auslesen von Dateien getroffen wird, hast du schnell mal eine Endlos-Rekursion gebaut. Ich würde dir raten, solche Konstrukte zu vermeiden es sei denn, du weißt *genau* was du tust. Und den Anschein hat es hier nicht wirklich, oder warum speicherst du den Rückgabewert eines echo?

-- asem
 
Oben