Pomocí příkazu `select` vytisknete nabídku v Bash

Pokouším se implementovat jednoduché menu pomocí select příkaz. Skript (pro účely testování) je následující:

#!/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 "*********************" 

Skript nerozpoznává žádné platné vstupy, které zadám, a vždy vytiskne zprávu „neplatná volba“. Co dělám špatně v tomto skriptu?

Komentáře

  • Váš vstup je 1, 2 nebo 3, že?

Odpověď

Vaše nabídka zobrazená výběrem bude vypadat takto:

1) apache 2) named 3) sendmail Select an option and press Enter: 

V tuto chvíli zadáte “ 1 „nebo“ 2 „nebo“ 3 „: slovo nezadáte.

Rovněž select bude smyčkovat, dokud neuvidí break příkaz, takže chcete tento:

 case $opt in "apache") date break ;; "named") echo "test" break ;; "sendmail") echo "test 2" break ;; *) echo "invalid option";; esac 

Pokud jste chtěli uživateli povolit zadání čísla nebo slovo, můžete napsat toto:

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 

Čárka nemá žádný syntaktický význam, je tam jen proto, aby bylo možné vzorovat shodu na $ REPLY proměnná (což uživatel skutečně zadal) nebo proměnná $ opt

Komentáře

  • select příkaz vyžaduje break, ne case.
  • Děkuji! Neuvědomil jsem si, že jde o numerické možnosti. Duhh!
  • Hah, já taky programuji v C a potřebujete tam break v každé sekci. Nikdy však nebudete potřebovat break v případě … esac bloku v shell skriptu . Může se to stát tak snadno, že je zamícháme. 🙂
  • @syntaxerror, máte ' pravdu, ' nepotřebujete break pro case. K úniku ze smyčky select však potřebujete break.
  • @glenn jackman Chtěl bych mít toto se změnil na užitečnější komentář (viz dále). Bylo by skvělé, kdybyste souhlasili se smazáním komentáře od 12:55. Totéž samozřejmě udělám s mým.

Odpovědět

Vaše $opt proměnná bude nastavena na slovo možnosti odpovídající číslu , které uživatel zadá. Pokud se chcete podívat na to, co uživatel skutečně zadal, podívejte se na $REPLY.

Komentáře

  • Vzhledem k tomu, že case porovnává $opt s " apache ", " pojmenované " a " sendmail ", je to správné a nic se nemusí měnit.
  • @manatwork, pokud OP nechce, aby uživatel zadával slova " apache ", " s názvem " nebo " sendmail " místo stisknutí 1, 2 nebo 3.
  • Zajímavé. $ REPLY obsahuje 1 / 2 / 3 a $ opt obsahuje apache / named / sendmail
  • @fred, ano, je cokoli, co uživatel zadal, a pokud to bylo platné číslo, bude $opt slovo odpovídající tomuto číslu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *