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.