Yritän toteuttaa yksinkertaisen valikon käyttämällä select
komento. Komentosarja (testausta varten) on seuraava:
#!/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 "*********************"
Skripti ei tunnista mitään antamiani kelvollisia syötteitä ja tulostaa aina virheellisen vaihtoehdon viestin. Mitä teen väärin tässä käsikirjoituksessa?
kommentit
- syötteesi on 1, 2 tai 3, eikö?
Vastaus
select-valikon näyttämä valikko näyttää tältä:
1) apache 2) named 3) sendmail Select an option and press Enter:
Tällä hetkellä kirjoitat ” 1 ”tai” 2 ”tai” 3 ”: et kirjoita sanaa.
Myös select
silmukkaa, kunnes se näkee break
-komento, joten haluat tämän:
case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac
Jos haluat antaa käyttäjän antaa joko numeron tai sana, voit kirjoittaa tämän:
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
Pilkulla ei ole syntaktista merkitystä, se on vain siellä, jotta se voi kuvioida joko $ REPLY muuttuja (minkä käyttäjä itse kirjoitti) tai $ opt -muuttuja
Kommentit
-
select
-komento tarvitseebreak
, eicase
. - Kiitos! En tajunnut, että se oli numeerinen vaihtoehto. Duhh!
- Hah, minäkin ohjelmoin C: ssä ja tarvitset
break
siellä jokaisessa osiossa. Et kuitenkaan koskaan tarvitsebreak
-tietoa -tapauksessa … esac -lohkossa komentotiedostossa . Niiden sekoittuminen voi tapahtua niin helposti. 🙂 - @syntaxerror, olet ' oikeassa, et ' tarvitse
break
kohteellecase
. Tarvitset kuitenkinbreak
, jotta pääsetselect
-silmukasta. - @glenn jackman Haluaisin tämän muuttui hyödyllisemmäksi kommentiksi (katso seuraava). Joten olisi hienoa, jos suostuisit poistamaan kommenttisi klo 12.55. Teen tietysti saman minun.
Vastaa
$opt
-muuttuja asetetaan asetussanaksi, joka vastaa käyttäjän syöttämää numeroa . Jos haluat katsoa, mitä käyttäjä itse kirjoitti, katso $REPLY
.
Kommentit
- Ottaen huomioon, että
case
vertaa$opt
" apache ", " nimeltään " ja " sendmail ", se on oikea eikä mitään tarvitse muuttaa. - @manatwork, ellei OP halua käyttäjän kirjoittavan sanoja " apache ", " nimetty " tai " sendmail " eikä painaa 1, 2 tai 3.
- Mielenkiintoista. $ REPLY pitää sisällään
1
/2
/3
ja $ opt pitää sisälläänapache
/named
/sendmail
- @fred, kyllä,
$REPLY
on käyttäjän kirjoittama mitä tahansa, ja jos se oli kelvollinen numero, numeroa vastaava sana on$opt
.