A `select` paranccsal menüt nyomtathat a Bash-ban

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 parancsnak break -re van szüksége, nem pedig case -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ége break -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 egy break -re, hogy elkerülje az select 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 a apache / 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ó.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük