Sida 1 av 1

Bash meny fråga

Postat: 19 okt 2010, 12:24
av red
Hej!

Jag är ny när de gäller bash scripting så jag hoppas ni förstår jag vad vill komma fram till :) Håller på med en övning som jag blir galen på för jag vet inte hur jag ska avsluta den.

Jag har tyvärr ingen kod att visa upp för den ligger på en dator jag inte kommer åt för tillfället men jag skall försöka förklara så tydligt som möjligt:

Jag har 1 script med flera funktioner:

1. Sudo manual
2. Filstruktur manual
3. Övrigt
4. Exit

Alla dessa val skall representeras via en meny.

Grejen är att jag har tittat på olika menyer man kan skriva men problemet är att jag har redan skrivit 400rader kod ungefär såhär:

###### Sudo manual ######
function manual {
< TEXT >
}
# Slut
###### Filstruktur Manual ######
function filstruktur {
< TEXT >
}
# Slut

Varje manual har en function (om det nu är möjligt att göra så).
Själva idén jag hade var att skriva all kod först å på något sätt länka dessa med en function som anropas via menyval.

Trycker jag på 1an i menyn högst upp så skall t ex function manual anropas och då visas det jag skrivit efter ######## Sudo Manual #####.

Trycker jag på 2an så skall all text jag skrivit efter #### Filstruktur manual #### dyka upp.

Detta kanske är praktiskt omöjligt men då undrar jag.. Hur i efterhand ska jag göra för att anropa dessa olika delarna med en meny?

Hoppas jag inte rört till det för mkt :)

Re: Bash meny fråga

Postat: 19 okt 2010, 13:10
av Ulsak
japp, det är knäckfrågan hur man anropar den text som skall finnas. vad använder du för textredigerare? Kate, Nano eller Gedit. Den sistnämnda brukar vara smidig då den färgar koden..

Re: Bash meny fråga

Postat: 19 okt 2010, 13:15
av red
Ulsak skrev:japp, det är knäckfrågan hur man anropar den text som skall finnas. vad använder du för textredigerare? Kate, Nano eller Gedit. Den sistnämnda brukar vara smidig då den färgar koden..
Jag kör med vi ;)

Re: Bash meny fråga

Postat: 19 okt 2010, 15:20
av Konservburk
Här har du ett exempel på hur det kan se ut:

Kod: Markera allt

#!/bin/bash

funktion_A(){
   echo A
}
funktion_B(){
   echo B
}
funktion_C(){
   echo C
}

select REPLY
in foo bar baz
do case "$REPLY"
   in
   foo) funktion_A ;;
   bar) funktion_B ;;
   baz) funktion_C ;;
   *) continue ;;
   esac
   break
done

Re: Bash meny fråga

Postat: 19 okt 2010, 15:24
av mcNisse
Kan det var något sådant här du är ute efter (mycket ofullständigt)?

Kod: Markera allt

while true
do
    printmenu
    echo "Choose (1-4 0, exit)"
    read ans
    case $ans in
        0) break
            ;;
        1) val1
           ;;
        2) val2
           ;;
        osv
        *)
            echo "musch chooose a number between 1-4"
             ::
     ecac
done

Re: Bash meny fråga

Postat: 19 okt 2010, 17:05
av red
Konservburk skrev:Här har du ett exempel på hur det kan se ut:

Kod: Markera allt

#!/bin/bash

funktion_A(){
   echo A
}
funktion_B(){
   echo B
}
funktion_C(){
   echo C
}

select REPLY
in foo bar baz
do case "$REPLY"
   in
   foo) funktion_A ;;
   bar) funktion_B ;;
   baz) funktion_C ;;
   *) continue ;;
   esac
   break
done
Jag har i stort sett det upplägget du beskrev men vad som händer nu är att funktion_A körs automatiskt så fort man kör scriptet, trycker du på ENTER (som är ogiltigt val) går den över till funktion_B. gör du samma sak här, DÅ visas menyn!

Jag vill ju att den ska visas först :(

Re: Bash meny fråga

Postat: 19 okt 2010, 17:07
av red
red skrev:
Konservburk skrev:Här har du ett exempel på hur det kan se ut:

Kod: Markera allt

#!/bin/bash

funktion_A(){
   echo A
}
funktion_B(){
   echo B
}
funktion_C(){
   echo C
}

select REPLY
in foo bar baz
do case "$REPLY"
   in
   foo) funktion_A ;;
   bar) funktion_B ;;
   baz) funktion_C ;;
   *) continue ;;
   esac
   break
done
Jag har i stort sett det upplägget du beskrev men vad som händer nu är att funktion_A körs automatiskt så fort man kör scriptet, trycker du på ENTER (som är ogiltigt val) går den över till funktion_B. gör du samma sak här, DÅ visas menyn!

Jag vill ju att den ska visas först :(

EDIT: Jag såg att jag hade anrop till funktionen direkt efter } och när man tog bort dessa på funktion_A och funktion_B då visas menyn först.

Nu e problemet att trycker man på 1a valet så händer ingenting, samma med 2an i menyläget.

Menyn e såhär och ligger längst ner bland koden, dvs efter funktion smanual och funktion fmanual.

select menyval
in "Sudo manual" "Filsystem" "Avsluta"
do case "$menyval"
in
Sudo) smanual ;;
Filsystem) fmanual ;;
Avsluta) exit ;;
esac
done

Re: Bash meny fråga

Postat: 19 okt 2010, 17:58
av Konservburk
red skrev:Nu e problemet att trycker man på 1a valet så händer ingenting, samma med 2an i menyläget.

Menyn e såhär och ligger längst ner bland koden, dvs efter funktion smanual och funktion fmanual.

select menyval
in "Sudo manual" "Filsystem" "Avsluta"
do case "$menyval"
in
Sudo) smanual ;;
Filsystem) fmanual ;;
Avsluta) exit ;;
esac
done
Det första valetalternativet fungerar inte för dig eftersom du har satt det till "Sudo manual", men du matchar bara mot "Sudo" i case-satsen. Det här borde gå bättre:

Kod: Markera allt

select menyval
in "Sudo manual" "Filsystem" "Avsluta"
do case "$menyval"
   in
   "Sudo manual") smanual ;;
   "Filsystem") fmanual ;;
   "Avsluta") exit ;;
   esac
done

Re: Bash meny fråga

Postat: 19 okt 2010, 18:11
av red
Konservburk skrev:
red skrev:Nu e problemet att trycker man på 1a valet så händer ingenting, samma med 2an i menyläget.

Menyn e såhär och ligger längst ner bland koden, dvs efter funktion smanual och funktion fmanual.

select menyval
in "Sudo manual" "Filsystem" "Avsluta"
do case "$menyval"
in
Sudo) smanual ;;
Filsystem) fmanual ;;
Avsluta) exit ;;
esac
done
Det första valetalternativet fungerar inte för dig eftersom du har satt det till "Sudo manual", men du matchar bara mot "Sudo" i case-satsen. Det här borde gå bättre:

Kod: Markera allt

select menyval
in "Sudo manual" "Filsystem" "Avsluta"
do case "$menyval"
   in
   "Sudo manual") smanual ;;
   "Filsystem") fmanual ;;
   "Avsluta") exit ;;
   esac
done
I love you! Nu har jag äntligen fått det att fungera efter 9timmar :D