Bash, hoe laat je een questionding weer overnieuw beginnen?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Ik heb vanavond leren bash-scripten, kon het al een beetje, maar heb me kapot gegoogled en heb nu een installscript klaar voor sickbeard, maar ik loop toch tegen een paar dingen aan. Ik wil vragen stellen, maar wil voorkomen dat er onverwacht doorgegaan wordt met dingen als er iets anders dan yes of no wordt geantwoord, maar ik wil niet eindeloos herhalen, is er ook een returnfunctie ofzo? hoe lossen jullie dit op?

Ik heb dit:
code:
1
2
3
4
5
6
7
8
9
#make sure you wanna do this
echo 'This script will download and install Sickbeard as a daemon. It is my first original bash-script so use at own risk!'
read -p 'Are you sure you want to continue? (yes/no) ' Q1
if [ "$Q1" = "yes" -o "$Q1" = "y" ] 
then echo 'Continuing...'
elif [ "$Q1" = "no" -o "$Q1" = "n" ]
then echo 'Exiting...' && exit
else echo 'Answer yes or no or y or n'
fi


Nu wil ik natuurlijk niet finishen na Answer yes or no or y or n, maar eigenlijk weer bovenaan beginnen bij Are you sure you wan't to continue?

Ik kwam hetzelfde probleem tegen bij het instellen van een wachtwoord met verificatie, dat heb ik opgelost door de hele bups drie keer te herhalen. Hoe lossen jullie bovenstaande situaties op in scripting?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#set webinterface password (3 tries)
read -p 'Do you want to set a password for the webinterface? Stays blank if not set. (yes/no)   :' Q5
if [ "$Q5" = "yes" -o "$Q5" = "y" ] 
then read -p 'Set password to...   :' WEBPASSWORD1 && read -p 'Confirm password...   :' WEBPASSWORD2
else echo 'No password needed to log in'
fi

#password and sanitycheck
if [ "$WEBPASSWORD1" = "$WEBPASSWORD2" ] #passwordcheck 1
then echo "Username set to $WEBUSERNAME and password set to $WEBPASSWORD2" && sed -i "s/SBPWD=""/SBPWD="$WEBPASSWORD2"/g" ~/.sickbeard/initscriptv2
elif [ "$WEBPASSWORD1" != "$WEBPASSWORD2" ] 
then echo 'Passwords do not match, tried once' && read -p 'Set password to...   :' WEBPASSWORD3 && read -p 'Confirm password...   :' WEBPASSWORD4
elif [ "$WEBPASSWORD3" = "$WEBPASSWORD4" ] #passwordcheck 2
then echo "Username set to $WEBUSERNAME and password set to $WEBPASSWORD4" && sed -i "s/SBPWD=""/SBPWD="$WEBPASSWORD4"/g" ~/.sickbeard/initscriptv2
elif [ "$WEBPASSWORD3" != "$WEBPASSWORD4" ]
then echo 'Passwords do not match, tried once' && read -p 'Set password to...   :' WEBPASSWORD5 && read -p 'Confirm password...   :' WEBPASSWORD6
elif [ "$WEBPASSWORD5" = "$WEBPASSWORD6" ] #passwordcheck 3
then echo "Username set to $WEBUSERNAME and password set to $WEBPASSWORD6" && sed -i "s/SBPWD=""/SBPWD="$WEBPASSWORD6"/g" ~/.sickbeard/initscriptv2
else 'Passwords do not match 3 times in a row omg!, leaving blank, no passwords for you mister!)'
fi

Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 16-05 23:32

|>


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Of netter dan een for loop, een functie: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-8.html

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Is het niet zoiets in pseudocode:

code:
1
2
3
4
5
do
{
    vraag om antwoord
}
while (antwoord is niet correct)

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
thx. dat koste me nog even tijd. wat een late tweakers nog, had geen answer verwacht in middle of night. Heb het werkend met functions.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash 

#checking good answers
yesno ()
{
    read -p 'Are you sure you want to continue? (yes/no) ' Q1
    if [ "$Q1" = "yes" -o "$Q1" = "y" ] 
    then echo 'There we go'
    elif [ "$Q1" = "no" -o "$Q1" = "n" ]
    then echo 'Exiting...' && exit
    else wrong
    fi
}  
wrong ()
{
    echo 'Answer yes or no or y or n' 
    yesno
}  
yesno

Acties:
  • 0 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Wat Boudewijn schrijft, vind ik veel netter.

Je zou zelfs een functie kunnen schrijven die het voor jou afhandelt, zoals:

GetAnswer(question, array van mogelijke antwoorden)

Die het antwoord terug geeft.

Vervolgens doe je in de functie de while loop totdat de input gelijk is aan een van de mogelijke antwoorden en return je dat antwoord.

Zoiets zou ik doen iig.. want je wil vast vaker vragen stellen aan de gebruiker en dan blijft de flow van de hoofdroutine heel duidelijk.

Ben ff te lui om dit netjes in bash syntax te doen, maar je snapt vast wel wat ik bedoel :)

[ Voor 12% gewijzigd door Lethalis op 21-01-2011 17:15 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 16-05 18:58

Kees

Serveradmin / BOFH / DoC
code:
1
2
3
4
5
6
7
8
9
10
11
12
#make sure you wanna do this
echo 'This script will download and install Sickbeard as a daemon. It is my first original bash-script so use at own risk!'
while (true)
do
    read -p 'Are you sure you want to continue? (yes/no) ' Q1
    if [ "$Q1" = "yes" -o "$Q1" = "y" ] 
    then echo 'Continuing...' && break
    elif [ "$Q1" = "no" -o "$Q1" = "n" ]
    then echo 'Exiting...' && exit
    fi
    echo 'Answer yes or no or y or n'
done


while (true);
do vraag
wacht antwoord
antwoord negatief -> exit
antwoord positief -> break (breek uit de while loop)
antwoord anders -> blijf in de whileloop
done

Het tweede probleem kun je beter (naja, beter.. het kan ook gewoon in een whileloop) met een passwoordfunction oplossen; iets als (in psuedo code):
vraagWachtwoord() {
vraag WW1
vraag confirmatie
als ww1 != confirmatie, return vraagWachtwoord()
return ww1
}

[ Voor 8% gewijzigd door Kees op 21-01-2011 17:40 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
nee ik snap er niks van. ben gister begonnen met scripten moet overal voor googlen en test alles wat nieuw is in een apart script. ik kan dus niet zomaar whileloop doen want ik heb dat nog nooit gedaan. kun je wellicht toch een volledig voorbeeld tonen aan een bashnoob?

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 16-05 18:58

Kees

Serveradmin / BOFH / DoC
(het volledige voorbeeld staat erboven)

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
verversingsprobleem excuus. dat bericht was op mijn telefoon getypt en dat duurt eeuwen. bedankt voor dat voorbeeld ik test 'm even.

Wat is eigenlijk het voordeel? Behalve dat het netter is? Als je googlet dan kom je zoveel verschillende voorbeelden tegen, dus het wordt wel allemaal door elkaar gebruikt? Zijn daar een soort informele afspraken onder programmeurs onderling over gemaakt?

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Kees schreef op vrijdag 21 januari 2011 @ 17:32:
code:
1
2
3
4
5
6
7
8
9
10
11
12
#make sure you wanna do this
echo 'This script will download and install Sickbeard as a daemon. It is my first original bash-script so use at own risk!'
while (true)
do
    read -p 'Are you sure you want to continue? (yes/no) ' Q1
    if [ "$Q1" = "yes" -o "$Q1" = "y" ] 
    then echo 'Continuing...' && break
    elif [ "$Q1" = "no" -o "$Q1" = "n" ]
    then echo 'Exiting...' && exit
    fi
    echo 'Answer yes or no or y or n'
done
Dit vind ik door die break dan weer vies ;).
Wat je zet een evaluatie mogelijkheid op een constante om daarna met het handje alsnog te evalueren.

Waarom die string niet evalueren in de while clause?

[ Voor 22% gewijzigd door Boudewijn op 21-01-2011 20:36 ]

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Laat dan ook ff zien hoe het wel moet, misschien leert noobTS er ook wat van..., ik snap zelfs niet eens wat je zegt... nou ja, ik snap je wel, maar de bedoeling niet. hoe ziet dat er uit een string evalueren in de while?

while (true=yes,y,no,n,ja,j,nee,nein) ofzo?

Die van mij worden steeds langer...

Heb nu al dit voor het interactieve veranderen van ipadress en poort, kan dat veel korter?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#CHANGE IPADRESS:PORT
ipadress_port ()
{
read -p 'Enter new ipadress...    :' NEW_IP
read -p 'Enter new port...    :' NEW_PORT
}
confirm ()
{
read -p "You entered $NEW_IP:$NEW_PORT, is this correct? (yes/no)    :" Q5
if [ "$Q5" = "yes" -o "$Q5" = "y" ] 
    then echo "Ok, adding $NEW_IP:$NEW_PORT to config.ini..." &&
    sed -i "s/host = 0.0.0.0/host = $NEW_IP/g" $INSTALLDIR/config.ini &&
    sed -i "s/port = 5000/port = $NEW_PORT/g" $INSTALLDIR/config.ini &&
    exit
    elif [ "$Q5" = "no" -o "$Q5" = "n" ]
    then ipadress_port
    else wrong
fi
}
wrong ()
{
    echo 'Answer (yes/no) or (y/n)' 
    confirm
}  
ipadress_port
confirm


Heel vies zeker ;-)

Ow ja, nog een vraagje. is dit soort spul ook te evalueren zonder dat je steeds een stuk script in de terminal execute? Is daar een schrijfprogramma ofzo voor, ik gebruik gedit, dat highlight wel dingen enzo, maar ik zie bijvoorbeeld niet dat ie direct merkt dat er een functie ontbreekt ofzo, dat kom je pas tegen als het opvalt of als je 'm execute.

[ Voor 23% gewijzigd door Mar2zz op 21-01-2011 21:43 ]


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Volgens mij ben ik eruit, of kan dit nog makkelijker?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
janee ()
{
while true;
do read -p 'zeg yes, of no of ietsanders' Q1
    if [ "$Q1" = "yes" -o "$Q1" = "y" ]
        then echo 'goedzo' &&
        som
    elif [ "$Q1" = "no" -o "$Q1" = "n" ]
        then echo 'needus' &&
        exit
    fi
echo 'Answer yes or no'
done
}
som()
{   
while true;
do read -p 'zeg 1, of 2 of ietsanders' Q1
    if [ "$Q1" = "1" ]
        then echo '1 ja' &&
        janee
    elif [ "$Q1" = "2" ]
        then echo '2' &&
        exit
    fi
echo 'Answer 1 or 2'
done
}
janee
som

Acties:
  • 0 Henk 'm!

  • Ertepeller
  • Registratie: November 2010
  • Laatst online: 15-05 15:10
Misschien heb je hier iets aan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash

# CHANGE IPADDRESS:PORT

while true
do
    read -p 'Enter new IP address: ' IP
    read -p 'Enter new port      : ' PORT

    read -p "You entered $IP:$PORT, is this correct? (yes/no, q = quit): "
   
    # REPLY is default variable for read
    # ${REPLY,,} betekent: converteer $REPLY naar lowercase

    case ${REPLY,,} in
        # Antwoord begint met een Y, y, J of j; dus Yes of ja of Yahoo
        [yj]*)
            echo "Ok, adding $IP:$PORT to config.ini..."

            sed -i "
                s/host = 0.0.0.0/host = $IP/g
                s/port = 5000/port = $PORT/g
            " $INSTALLDIR/config.ini
            ;;

        # Antwoord begint met N of n
        # Geen actie en ga verder met volgende IP/port vraag
        n*)
            ;;

        # Antwoord begint met Q of q
        # Stoppen
        q*)
            exit
            ;;

        # Antwoord begint met iets anders dan bovenstaande gevallen
        # Klagen en verder met volgende IP/port vraag
        *)
            echo 'Answer yes, no or quit'
            ;;
    esac
done

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Waarom een evaluatie op true zetten en dan daarna alsnog op een string evalueren.
Lelijk, zie dan ook mijn voorbeeld hierboven.

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Ik snap jouw voorbeeld niet Boudewijn, blijkbaar anderen ook niet? anders maken ze het toch niet steeds lelijk...

Ik ben nu al een paar dagen aan het scripten en het wordt steeds leuker. Ben met 1 file bezig, maar probeer het zo portable mogelijk te maken door veel met variables en functies te werken.

de feedback uit dit topic en uit de reacties bij mijn laatste blog heb ik zoveel mogelijk proberen te snappen en verwerken.

Gisteravond ontdekte ik pas wat voor voordeel het heeft om van alles een functie te maken en dan de functie aan te roepen. Dat test een stuk makkelijker, elke functie die tests heeft doorstaan kan ik commenten en dan de volgende toevoegen en zo met het hele script een klein gedeelte testen. Bovendien krijg ik nu allemaal mooie 'knipsels', portable functies, knippen en plakken in andere scripts...

Al zie ik nu dat case / esac, en dat ken ik dus nog niet... mooi voorbeeld trouwens, snap niet waarom die lelijk gevonden wordt.

bash-scripten is wel een leuke hobby en erg toegankelijk voor mensen zonder programmeerervaring (people like me!)

Dus Boudewijn, laat je pareltje eens zien hoe dat nu moet? Een confirm password voobeeldje graag... ;-)

Acties:
  • 0 Henk 'm!

  • Ertepeller
  • Registratie: November 2010
  • Laatst online: 15-05 15:10
Voorbeeldje uitgesplitst in functies:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash

Main() {
    while Questions
    do
        ParseAnswers
    done
}

Questions() {
    read -p 'Enter new IP address: ' IP
    read -p 'Enter new port      : ' PORT

    until Confirm; do :; done

    [[ $REPLY != q* ]]
}

Confirm() {
    read -p "You entered $IP:$PORT, is this correct? (yes/no/quit): "

    [[ ${REPLY,,} = [yjnq]* ]]
}

ParseAnswers() {
    [[ $REPLY = [yj]* ]] && AddIP

    echo
}

AddIP() {
    echo "Ok, adding $IP:$PORT to config.ini..."

    # sed -i "
    #     s/host = 0.0.0.0/host = $IP/g
    #     s/port = 5000/port = $PORT/g
    # " $INSTALLDIR/config.ini
}

Main

Dat levert dan deze output op:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$> ./foobar.sh 
Enter new IP address: 123
Enter new port      : 456
You entered 123:456, is this correct? (yes/no/quit): 
You entered 123:456, is this correct? (yes/no/quit): asdf
You entered 123:456, is this correct? (yes/no/quit): nee

Enter new IP address: 123
Enter new port      : 456
You entered 123:456, is this correct? (yes/no/quit): ja hoor, doe maar
Ok, adding 123:456 to config.ini...

Enter new IP address: 123
Enter new port      : 456
You entered 123:456, is this correct? (yes/no/quit): q
$>

[ Voor 45% gewijzigd door Ertepeller op 24-01-2011 07:47 ]


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Er is gister wat mis gegaan met mijn reply, ik had je al bedankt voor je code, ziet er goed uit, dat hele case/esac is nieuw voor me.

Ik zit me nu af te vragen of ik niet gewoon 1 questionding kan maken die alle yes/nos van andere functies afhandelt mocht dat nodig zijn. ik ga ff met je code prutsen...

Heb wat leuke ideeen voor een totaalscript dat andere scripts aanroept enzo, maar ik ben nog te 'freshmen' om dat binnen een paar dagen helemaal zo te krijgen als ik wil, ik kom te vaak in een loopje terecht zeg maar. tof dat jullie helpen opleiden in ieder geval.

Je code levert mij een fout op:
code:
1
2
3
4
Enter new IP address: 123
Enter new port      : 123
You entered 123:123, is this correct? (yes/no/quit): read: 40: arg count
testding: 40: Bad substitution

[ Voor 15% gewijzigd door Mar2zz op 24-01-2011 19:38 ]


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Mar2zz schreef op zondag 23 januari 2011 @ 08:59:
Ik snap jouw voorbeeld niet Boudewijn, blijkbaar anderen ook niet? anders maken ze het toch niet steeds lelijk...
MWa ligt aan je mentaliteit. Wat snap je niet?
Ik ben nu al een paar dagen aan het scripten en het wordt steeds leuker. Ben met 1 file bezig, maar probeer het zo portable mogelijk te maken door veel met variables en functies te werken.
Goed zo maar maak het niet te functie-bloated.
Gisteravond ontdekte ik pas wat voor voordeel het heeft om van alles een functie te maken en dan de functie aan te roepen. Dat test een stuk makkelijker, elke functie die tests heeft doorstaan kan ik commenten en dan de volgende toevoegen en zo met het hele script een klein gedeelte testen. Bovendien krijg ik nu allemaal mooie 'knipsels', portable functies, knippen en plakken in andere scripts...
Yup, en je hebt modulaire leesbare code waarbij elke functie 1 (een, een!) ding doet.
Al zie ik nu dat case / esac, en dat ken ik dus nog niet... mooi voorbeeld trouwens, snap niet waarom die lelijk gevonden wordt.
Dat hoor je mij niet zeggen.
bash-scripten is wel een leuke hobby en erg toegankelijk voor mensen zonder programmeerervaring (people like me!)
Imo is bash vies, kijk eens naar Haskell of desnoods Ruby of Python.
Dus Boudewijn, laat je pareltje eens zien hoe dat nu moet? Een confirm password voobeeldje graag... ;-)
Kijk eens goed naar mijn code, wat is het verschil qua structuur?

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Heb je het over dit voorbeeld?
do
{
vraag om antwoord
}
while (antwoord is niet correct)

is voor mij te weinig om te snappen ik ben echt een totaal onbekend, heb wel eens wat code aangepast maar nog nooit gemaakt. Als ik google op zulke dingen dan kom ik terecht in de wereld aan antwoorden waarbij 'de manier uit de tweede post de meest beschreven is...
zoiets?

do
vraag () {
read -p "Wil je een voorbeeld geven?"
while
$REPLY != [YyNnQq]*
done

fuuuuuuuuuuuuuuuuuu wat ik ook probeer ik krijg 'm er niet uit! Ik google me suf, maar zoeken op do is verschrikkelijk, kom de hele tijd bij while true loops uit.
Ik vind het met case evalueren dan toch het meest inzichtelijk

[ Voor 84% gewijzigd door Mar2zz op 24-01-2011 20:53 ]


Acties:
  • 0 Henk 'm!

  • Ertepeller
  • Registratie: November 2010
  • Laatst online: 15-05 15:10
Bash kent geen "do { ... } while condition" constructie, dus dat gaat niet lukken.

Je kan zoiets doen:
code:
1
2
3
4
5
6
AskQuestions

while Answers 
do
    AskQuestions
done


maar dat ziet er niet uit.

Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Ik heb al mijn questions al omgeturnd naar esac, bedankt voor dat voorbeeld. Vind ik erg overzichtelijk moet ik zeggen, en het is makkelijk kaal als knipsel te gebruiken voor andere vragen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#In case of multiple questions
    set_IP () {
        read -p 'Enter new ipadress, default is 0.0.0.0 ...    :' NEW_IP
        read -p 'Enter new port, default is 5000 ...    :' NEW_PORT

            cf_IP () {
            echo "You entered $NEW_IP:$NEW_PORT, is this correct?  :"
            read -p "(yes/no)   :" REPLY
            case $REPLY in
                [Yy]*)
                    echo "Ok, adding $NEW_IP:$NEW_PORT to config.ini..."
                    sed -i "
                        s/host = 0.0.0.0/host = $NEW_IP/g
                        s/port = 5000/port = $NEW_PORT/g 
                    " $INSTALLDIR/config.ini
                ;;
                [Nn]*)
                    set_IP
                ;;
                *)
                    echo "Answer yes or no"
                    cf_IP
                ;;
            esac
            }
        cf_IP
    }


En ook embedded in andere functies zodat ie 2 kanten opkan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    new_Config(){
        
        get_Config () { #download new config.ini
        mkdir tmp_config
        cd tmp_config
        wget $DROPBOX/$APP/config.ini
        cp -f --suffix=.bak config.ini $INSTALLDIR/config.ini
        cd /home/$USER
        rm -R tmp_config
        }
        
        import_Config() { # import config.ini
        read -p 'Type the path and filename of the configurationfile you want to import...   :' IMPORTCONFIG
        if [ -e $IMPORTCONFIG ] then;
            cp -f --suffix=.bak $IMPORTCONFIG $INSTALLDIR/config.ini &&
            /etc/init.d/$APPLOW start &&
            echo "Point your webbrowser to you know where and have fun using $APP!"
            exit                
        else
            echo 'File does not exist, enter correct path as /path/to/file.ext' &&
            import_Config
        fi
        }
        
        cf_Import () { # Confirm import
        echo "Do you want to import your own configurationfile?"
        read -p "(yes/no)   :" REPLY
        case $REPLY in
            [Yy]*)
                import_Config
                ;;
            [Nn]*)
                echo "Downloading fresh config from dropbox.com"
                get_Config
            ;;
            *)
            echo "Answer yes or no"
                cf_Import
            ;;
            esac
        }
    cf_Import
    }


Zal ongetwijfeld lelijk zijn, maar het heeft het gewenste resultaat en het belangrijkste is dat ik het snap :p

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

offtopic:
Zo'n statement heet een case en niet een esac :)

Ik heb elektra-inbouwmaterialen over? Kopen? Zie: hier


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Boudewijn... vage gozert. Ik ga het niet aanpassen :p

Acties:
  • 0 Henk 'm!

  • Ertepeller
  • Registratie: November 2010
  • Laatst online: 15-05 15:10
code:
1
2
    read -p "(yes/no)   :" REPLY
    case $REPLY in

De REPLY achter "read" is overbodig, die gebruikt bash al als default variabele als je niets opgeeft.
Maar dat kan verder geen kwaad natuurlijk :)

Kijk wel uit met dit soort constructies:
code:
1
2
3
4
5
6
    mkdir tmp_config
    cd tmp_config
    wget $DROPBOX/$APP/config.ini
    cp -f --suffix=.bak config.ini $INSTALLDIR/config.ini
    cd /home/$USER
    rm -R tmp_config

Ik bedoel de mkdir + cd + acties + cd terug + rm. Hier gaat het wel goed, omdat je cd /home/$USER (waarom niet gewoon cd?) doet, maar je moest eens weten hoe vaak ik in dit soort gevallen "cd .." zie. Als de eerste cd mislukt (omdat mkdir om wat voor reden dan ook niet goed gaat) en de 2e gaat wel goed, kun je onverwachte resultaten krijgen bij rm ...
Beter is:
code:
1
2
3
4
5
mkdir somedir
(cd somedir && {
    acties
})
rm -rf somedir

Door de cd + acties binnen ronde haakjes te zetten, hoef je geen "cd terug" te doen, omdat "cd + acties" binnen een sub-shell worden uitgevoerd. De rm wordt dus altijd uitgevoerd in dezelfde directory als waar de mkdir is gedaan.

Je zou ook /tmp kunnen gebruiken i.p.v. tmp_config, dan hoef je achteraf niets op te ruimen - daar is /tmp nou juist voor :) En dan geen cp doen, maar mv.
Of: vooraf originele config moven naar config.ini.bak en dan een wget doen van de nieuwe, heb je geen tmp nodig.

Zou nog makkelijker zijn als je rsync zou kunnen gebruiken, dan kan alles in 1 regel, maar ik weet niet of Dropbox met rsync werkt? Zoiets dus:
code:
1
rsync --backup --suffix=.bak $DROPBOX/$APP/config.ini $INSTALLDIR/

Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 21-03 16:17

afraca

Open Source!

Trouwens, slighty offtopic, maar merkte het op. Het leuke van zo'n shebang is dat je een command niet meer hoeft te starten met

code:
1
sh app.sh


maar gewoon met
code:
1
 ./app.sh


( ./ = working directory ) En wat betreft cross platform compatibility... Weet niet of iedereen bash in /bin/bash heeft staan, of sowiezo bash heeft (bash = bourne again shell) , of die shell wil gebruiken. Misschien dat je /usr/bin/env bash kan gebruiken. Zie ook:
https://secure.wikimedia....hebang_(Unix)#Portability

[ Voor 7% gewijzigd door afraca op 26-01-2011 22:53 ]

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Ertepeller schreef op woensdag 26 januari 2011 @ 20:52:
Zou nog makkelijker zijn als je rsync zou kunnen gebruiken, dan kan alles in 1 regel, maar ik weet niet of Dropbox met rsync werkt? Zoiets dus:
code:
1
rsync --backup --suffix=.bak $DROPBOX/$APP/config.ini $INSTALLDIR/
Thx man, wat ben jij behulpzaam! Ik ga dat rsync nog wel even bekijken, was het inderdaad al een paar keer tegengekomen, maar nog geen testjes gedraaid, maar wil nu eerst een menu-script maken waarmee ik installerscripts uit mijn dropbox haal. Nog nooit een menuutje gedaan, maar heb ondertussen mooie bronnen gevonden voor bash-syntax.

Wat betreft REPLY, macht der gewoonte, ik moet alles in stapjes in mijn hoofd hebben. Ik vind het bijvoorbeeld ook lastig om bij een Yes via een case-evaluatie weer terug te gaan naar de main zonder dat ik iets ga lopen echo'en of commented maak dat ie naar Main moet.

Wat betreft die wget:
code:
1
2
3
4
5
6
7
8
9
        get_Config () {  #download new config.ini
        if [ -e $INSTALLDIR/config.ini ]
            then
            mv -f $INSTALLDIR/config.ini $INSTALLDIR/config.ini.bak &&
            wget -P $INSTALLDIR $DROPBOX/$APP/config.ini
        else
            wget -P $INSTALLDIR $DROPBOX/$APP/config.ini
        fi
        }


De installdir is eerder al opgegeven en getest op rw-rechten door te githubben.
mijn 0.5'jes staan hier, al die case's erin aan jou te danken ;)
Hier het script voor SickBeard
CouchPotato.
afraca schreef op woensdag 26 januari 2011 @ 22:52:
Trouwens, slighty offtopic, maar merkte het op. Het leuke van zo'n shebang is dat je een command niet meer hoeft te starten met

code:
1
sh app.sh


maar gewoon met
code:
1
 ./app.sh


( ./ = working directory ) En wat betreft cross platform compatibility... Weet niet of iedereen bash in /bin/bash heeft staan, of sowiezo bash heeft (bash = bourne again shell) , of die shell wil gebruiken. Misschien dat je /usr/bin/env bash kan gebruiken. Zie ook:
https://secure.wikimedia....hebang_(Unix)#Portability
Ja, ik zie dat dat zo is. Maar ik zit al met een paar crossplatformprobleempjes omdat ik het dev/null gebeuren niet goed snap ben ik bij packagetesten (en eventueel installatie) uitgegaan van apt. dus yum, rpm, en pac vallen dan al af...

Weet je, als je gaat lopen googlen wat je nou het beste kunt doen met bashen kom je zoveel tegen. De een zegt zo en de ander zegt zo. Bovendien is het lastig zoeken op kleine woorden zoals while en do en true etc... In mijn blog kreeg ik al de tip om te switchen van !/bin/sh naar !bin/bash dus dat heb ik gedaan. En aangezien dit ook een kleine aanpassing is zal ik dat ook wel doen.

Wat betreft die ./app.sh, dat heb ik nog nooit aan de praat gekregen... Zal wel aan mij liggen. wat doe ik verkeerd? Ze staan in mijn homefolder: output
code:
1
2
3
4
mar2zz@Lynxtop:~$ ./couchpotatoinstall.sh
bash: ./couchpotatoinstall.sh: Bestand of map bestaat niet
mar2zz@Lynxtop:~$ ./testding.sh
bash: ./testding.sh: Bestand of map bestaat niet


.

[ Voor 45% gewijzigd door Mar2zz op 26-01-2011 23:21 ]


Acties:
  • 0 Henk 'm!

  • DutchNutcase
  • Registratie: Augustus 2005
  • Niet online

DutchNutcase

E = mc^2

Mar2zz schreef op woensdag 26 januari 2011 @ 22:59:

[...]

Wat betreft die ./app.sh, dat heb ik nog nooit aan de praat gekregen... Zal wel aan mij liggen. wat doe ik verkeerd? Ze staan in mijn homefolder: output
code:
1
2
3
4
mar2zz@Lynxtop:~$ ./couchpotatoinstall.sh
bash: ./couchpotatoinstall.sh: Bestand of map bestaat niet
mar2zz@Lynxtop:~$ ./testding.sh
bash: ./testding.sh: Bestand of map bestaat niet


.
Laat eens een ls -l los op die scripts. Heb je ze wel executable gemaakt? Dat kan met
chmod +x <script>

Luctor et Emergo || specs


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 21-03 16:17

afraca

Open Source!

Zelfs al gaat het niet om cross-platform portability, waar je je rustig later over mag buigen, is het vaak handiger te werken met /usr/bin/env , omdat iemand die een andere shell wil gebruiken simpelweg de environment variable maar hoeft te veranderen, in plaats van jouw script :)

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
DutchNutcase schreef op donderdag 27 januari 2011 @ 07:33:
[...]


Laat eens een ls -l los op die scripts. Heb je ze wel executable gemaakt? Dat kan met
chmod +x <script>
haha dat was 't. en ik altijd maar aannemen dat ie allang executable was omdat ie wel gerund word als je 'm sh't, maar dan is ie gewoon een parameter van sh...

...

Wat betreft crossplatformcompatibility, wat is een uniforme manier om packages te testen? python of git luisteren nog wel als je ze als command execute, maar python-cheetah bijvoorbeeld niet. Hoe check je of die aanwezig is op een systeem?

Ik heb nu dit, maar dat is alleen via apt:
code:
1
2
3
4
5
6
7
8
9
 PACK3=python-cheetah;

        if dpkg --status $PACK3 | grep -w "install ok installed"
            then
            echo "$PACK3 allready installed"
        else 
            echo "$PACK3 needs to be installed for $APP to work"
            pack3_check 
        fi


Om het crossplatform te maken zou ik bij het ontbreken van een package natuurlijk een een request kunnen doen voor manual install...
zoiets als:
code:
1
2
3
4
5
if [! $packagename]
    then
    echo "Use your packagemanager to install $packagename e.g. sudo apt-get install package"
    read -p "Type command to install :"
fi

[ Voor 50% gewijzigd door Mar2zz op 27-01-2011 19:07 ]


Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
Ik heb nu ook door waarom ./app.sh te prefereren is boven sh app.sh... sh kan lang niet alles vertalen, daar liep ik tegenaan met het press any key to continue...

Heb denk ik een oplossing voor mijn crossplatform-probleempje, alleen loop ik dan nog wellicht tegen package names aan, maar in geval van installatie wordt het als volgt opgelost:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env bash

use_PM () {
    def_PM () {
    [ -x "$(which $1)" ]
    }

if def_PM apt-get
    then 
    use_Apt
elif def_PM yum
    then
    use_Yum
elif def_PM pacman 
    then 
    use_Pac
else
    echo 'No package manager found!'
    man_Install
fi
}

use_Apt () {
sudo apt-get install $INST_PACK ||
man_Install
}

use_Yum () {
sudo yum install $INST_PACK ||
man_Install
}

use_Pac () {
sudo pacman -S $INST_PACK ||
man_Install
}

man_Install () {
echo "Installing $INST_PACK failed"
echo "Please install manually..."
echo "Type the command to install $INST_PACK"
echo "e.g. sudo apt-get install $INST_PACK"
read -p "   :" MAN_INST
if $MAN_INST 
    then
    echo "Succes!"
    else
    echo "Failed! Solve this before continuing installation"
    exit
fi
}
use_PM


Of kan dat beter anders?

Acties:
  • 0 Henk 'm!

  • serhat
  • Registratie: December 2002
  • Laatst online: 22-09-2023
Ik las er even toevallig doorheen. Even alleen maar om aan te geven om er aan te denken mits je dat nog niet hebt gedaan.

Ik neem aan dat de verschillende package managers zijn om bijvoorbeeld een bepaald package te downloaden? (voorbeeld openssl library) Doe je dit ook dynamisch per package?

Waar ik dan op doel is dat een package per package manager (en zelfs OS versie) een andere naam kan hebben:
i.e. (hypothetisch):
apt-get install openssl (debian 5.3)
apt-get install libopenssl (debian 5.4)
apt-get install openssl0.9 (ubuntu)
yum install lib-openssl

etc.

Als je daar geen rekening mee houdt, kan er nog steeds veel mis gaan. Ik denk dat veel platformen ondersteunen dan ook moeilijk(er) gaat worden. Als ik het totaal verkeerd heb gelezen, mijn welgemeende excuses. :P

Acties:
  • 0 Henk 'm!

  • Mar2zz
  • Registratie: September 2007
  • Laatst online: 05-04 16:33
als hij de packagenaam niet kan resolven (ik gebruik de ubuntu namen als default, maar het zijn variabelen die bovenin het script aangepast kunnen worden, dus als ik equivalenten krijg van de packages voor andere systemen dan kan ik het per systeem opgeven als bv PACK1_YUM=openssl-0.8)). Als het niet lukt om de package te installen dan valt ie terug op manual install. dan vraagt de terminal of je het commando zelf wil typen en als het dan nog niet lukt dan komt ie in een loop, succesvolle installatie of CTRL+C de enige uitweg. Daarom ook die echo op het laatst, wat ik overigens al veranderd heb in dit:
code:
1
2
3
4
            echo "Failed! Solve this before continuing installation"
            echo "Try again or press CTRL+C to quit"
            use_Manual 
        fi


wat ik nu dan eerst doe is wel even een waarschuwing echo'en dat de packagename kan afwijken in geval van een andere packagemanager dan apt. (kut dan zit ik nog steeds met debian/buntu different names). nah ja, ben in ieder geval een stukje dichterbij...

python bijvoorbeeld zal toch wel overal python heten...

[ Voor 17% gewijzigd door Mar2zz op 28-01-2011 12:30 ]


Acties:
  • 0 Henk 'm!

  • serhat
  • Registratie: December 2002
  • Laatst online: 22-09-2023
Ok, dat is prima. Geloof ook niet dat de packagenames snel anders zullen zijn, al heb ik dat wel eens meegemaakt. Het zou toevallig bij jou ook zo kunnen zijn. Je kan overigens via packages.debian.org en packages.ubuntu.com kijken of ze inderdaad wel overeenkomen. Voor python lijkt het wel het geval.

Was even gewoon iets om in je achterhoofd te houden bij een cross-distro oplossing. :)
Pagina: 1