Bash'te bir menü yazdırmak için `select` komutunu kullanma


10

selectKomutu kullanarak basit bir menü uygulamaya çalışıyorum . Komut dosyası (test amacıyla) aşağıdaki gibidir:

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

Komut dosyası verdiğim geçerli girişleri tanımıyor ve her zaman "geçersiz seçenek" iletisini yazdırıyor. Bu senaryoda yanlış olan ne?


4
Girişiniz 1, 2 veya 3, değil mi?
— enzotib

Yanıtlar:


11

Select ile gösterilen menünüz şöyle görünecektir:

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

Şu anda "1" veya "2" veya "3" giriyorsunuz: kelimeyi yazmıyorsunuz.

Ayrıca, selectbir breakkomut görene kadar döngü yapacaktır , böylece şunları yapabilirsiniz:

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

Kullanıcının numarayı veya kelimeyi girmesine izin vermek istiyorsanız, şunu yazabilirsiniz:

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

Virgülün sözdizimsel bir önemi yoktur, sadece $ REPLY değişkeni (kullanıcının gerçekten yazdığı şeydir) veya $ opt değişkeni üzerinde desen eşleşmesi var


selectKomutu bir ihtiyacı breakdeğil case.
— glenn jackman

Teşekkürler! Sayısal seçenekler olduğunu fark etmedim. Duhh!
— Sumod

Hah, ben de C'de programlıyorum ve breakher bölümde bir programa ihtiyacınız var. Ancak, bir ihtiyaç asla breakbir de vaka ... esac bir blok kabuk . Onları karıştırmak çok kolay olabilir. :-)
— syntaxerror

1
@syntaxerror, doğru, sen gerekmez mi breakiçin case. Ancak, döngü breakkaçmak için bir gerekir select.
— glenn jackman

@glenn jackman Bu daha yararlı bir yorum haline getirmek istiyorum (sonraki bakın). Bu yüzden yorumunuzu 12:55'ten silmeyi kabul ederseniz harika olur. Ben de aynısını benimkiyle yapacağım.
— sözdizimi

3

Kişisel $optdeğişken karşılık gelen seçenek sözcüğe ayarlanacaktır sayı kullanıcı girişlerine söyledi. Kullanıcının gerçekte ne yazdığına bakmak istiyorsanız, şuraya bakın $REPLY.


1
Olduğu göz önüne alındığında casekarşılaştırır $opt"apache", "adındaki" ve "sendmail" karşı, doğru olduğundan ve hiçbir şey değişti gerekir.
— manatwork

@manatwork, OP kullanıcının 1, 2 veya 3 tuşlarına basmak yerine "apache", "adlı" veya "sendmail" kelimelerini
— yazmasını istemedikçe

İlginç. $ REPLY tutar 1/ 2/ 3ve $ opt tutar apache/ named/sendmail
— Peter.O

@ fred, yes, $REPLYkullanıcı ne yazmış olursa olsun ve geçerli bir sayı olsaydı o sayıya $optkarşılık gelen kelime olacaktır.
— Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.