Egy egyszerű menüt próbálok megvalósítani a select
parancs. A szkript (tesztelési célokra) a következő:
#!/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 "*********************"
A szkript nem ismer fel semmilyen érvényes bemenetet, amelyet adtam, és mindig kinyomtatja az “érvénytelen opció” üzenetet. Mit csinálok rosszul ebben a forgatókönyvben?
Megjegyzések
- A bemenet 1, 2 vagy 3, igaz?
Válasz
A select által megjelenített menü a következőképpen fog kinézni:
1) apache 2) named 3) sendmail Select an option and press Enter:
Ekkor beírja ” 1 “vagy” 2 “vagy” 3 “: nem írja be a szót.
Ezenkívül az select
is ciklusba kerül, amíg meg nem jelenik egy break
parancsot, tehát ezt szeretné:
case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac
Ha azt szeretné, hogy a felhasználó megadhassa a számot vagy a szót, ezt írhatod:
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
A vesszőnek nincs szintaktikai jelentősége, csak azért van, hogy meg tudja mintázni a $ REPLY változó (amit a felhasználó ténylegesen beírt) vagy a $ opt változó
Megjegyzések
- A
select
parancsnakbreak
-re van szüksége, nem pedigcase
-re. - Köszönöm! Nem vettem észre, hogy numerikus lehetőségekről van szó. Duhh!
- Hah, én is programozok C-ben, és minden szakaszban szükséged van egy
break
-re. Azonban soha nem lesz szükségebreak
-re esetben … esac blokkra egy shell script -ben. Olyan könnyen előfordulhat, hogy összekeverik őket. 🙂 - @syntaxerror, igazad van ', nem kell ' szükséged
break
case
esetén. Szüksége van azonban egybreak
-re, hogy elkerülje azselect
hurkot. - @glenn jackman Szeretném, ha ez lenne hasznosabb megjegyzés lett (lásd a következőt). Szóval nagyon jó lenne, ha megállapodnál abban, hogy törlöd a megjegyzésedet 12: 55-től. Természetesen ugyanezt fogom tenni az enyémmel is.
Válasz
A $opt
változó a felhasználó által beírt szám nak megfelelő opciószóra lesz beállítva. Ha meg szeretné nézni, hogy a felhasználó mit írt be, nézze meg a $REPLY
cikket.
Megjegyzések
- Tekintettel arra, hogy a
case
összehasonlítja a$opt
-et a " apache ", " " és " sendmail ", helyes és semmit sem kell változtatni. - @manatwork, kivéve, ha az OP azt akarja, hogy a felhasználó írja be a " szavakat apache ", " " vagy " sendmail " ahelyett, hogy megnyomná az 1, 2 vagy 3 gombot.
- Érdekes. A $ REPLY megtartja a
1
/2
/3
, a $ opt pedig aapache
/named
/sendmail
- @fred, igen,
$REPLY
bármi, amit a felhasználó beírt, és ha érvényes szám volt, akkor a$opt
lesz a szónak megfelelő szó.