Käyttämällä `select` -komentoa tulosta valikko Bashissa

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 tarvitsee break, ei case.
  • Kiitos! En tajunnut, että se oli numeerinen vaihtoehto. Duhh!
  • Hah, minäkin ohjelmoin C: ssä ja tarvitset break siellä jokaisessa osiossa. Et kuitenkaan koskaan tarvitse break -tietoa -tapauksessa … esac -lohkossa komentotiedostossa . Niiden sekoittuminen voi tapahtua niin helposti. 🙂
  • @syntaxerror, olet ' oikeassa, et ' tarvitse break kohteelle case. Tarvitset kuitenkin break, jotta pääset select -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ään apache / named / sendmail
  • @fred, kyllä, $REPLY on käyttäjän kirjoittama mitä tahansa, ja jos se oli kelvollinen numero, numeroa vastaava sana on $opt.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *