Ved å bruke kommandoen `select` for å skrive ut en meny i Bash

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 en break, ikke case.
  • 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 en break 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 for case. Du trenger imidlertid en break for å unnslippe select 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 holder apache / 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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *