prøver jeg å implementere en enkel meny ved hjelp av select
kommando. Skriptet (for testformål) er som følger:
#!/bin/bash echo "*******************" PS3="Select an option and press Enter: " options=("apache" "named" "sendmail") select opt in "${options[@]}" do case $opt in "apache") date ;; "named") echo "test" ;; "sendmail") echo "test 2" ;; *) echo "invalid option";; esac done echo "*********************"
Skriptet gjenkjenner ikke noen gyldige innganger jeg gir og skriver alltid ut «ugyldig alternativ» -meldingen. Hva gjør jeg galt i dette skriptet?
Kommentarer
- Inntastingen din er 1, 2 eller 3, ikke sant?
Svar
Menyen din som vises, vil se ut:
1) apache 2) named 3) sendmail Select an option and press Enter:
På dette tidspunktet skriver du » 1 «eller» 2 «eller» 3 «: du skriver ikke inn ordet.
Også select
vil løkke til den ser en break
-kommando, så du vil ha denne:
case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac
Hvis du vil la brukeren skrive inn enten nummeret eller ordet, du kan skrive dette:
select opt in "${options[@]}"; do case "$opt,$REPLY" in apache,*|*,apache) do_something; break ;; named,*|*,named) do_something; break ;; sendmail,*|*,sendmail) do_something; break ;; esac done
Kommaet har ingen syntaktisk betydning, det er bare der for å kunne matche mønster på enten $ REPLY variabel (som er hva brukeren faktisk skrev) eller $ opt-variabelen
Kommentarer
-
select
kommandoen trenger enbreak
, ikkecase
. - Takk! Jeg skjønte ikke at det var numeriske alternativer. Duhh!
- Hah, også jeg programmerer i C, og du trenger en
break
der i hver seksjon. Du trenger imidlertid aldri enbreak
i et tilfelle … esac -blokk i et skallskript . Det kan skje så lett å få dem blandet. 🙂 - @syntaxerror, du ' har rett, du trenger ikke ' t trenger
break
forcase
. Du trenger imidlertid enbreak
for å unnslippeselect
loop. - @glenn jackman Jeg vil gjerne ha dette ble til en mer nyttig kommentar (se neste). Så det ville være flott hvis du ble enige om å slette kommentaren fra 12:55. Jeg vil selvfølgelig gjøre det samme med meg.
Svar
Din $opt
-variabelen vil bli satt til alternativordet som tilsvarer nummeret som brukeren legger inn. Hvis du vil se på hva brukeren faktisk skrev, kan du se på $REPLY
.
Kommentarer
- Gitt at
case
sammenligner$opt
mot " apache ", " med navn " og " sendmail ", det er riktig og ingenting må endres. - @manatwork, med mindre OP vil at brukeren skal skrive inn ordene " apache ", " med navn " eller " sendmail " i stedet for å trykke 1, 2 eller 3.
- Interessant. $ REPLY holder
1
/2
/3
, og $ opt holderapache
/named
/sendmail
- @fred, ja,
$REPLY
er hva brukeren skrev, og hvis det var et gyldig nummer, vil$opt
være ordet som tilsvarer dette tallet.