`select`コマンドを使用してBashでメニューを印刷する


10

selectコマンドを使用して簡単なメニューを実装しようとしています。スクリプト(テスト用)は次のとおりです。

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

スクリプトは私が与える有効な入力を認識せず、常に「無効なオプション」メッセージを出力します。このスクリプトの何が問題になっていますか?


4
あなたの入力は1、2、または3ですよね?
enzotib 2011

回答:


11

selectで表示されるメニューは次のようになります。

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

このとき、「1」、「2」、「3」のいずれかを入力します。単語は入力しません。

また、コマンドが表示さselectれるまでループするので、break次のようにします。

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

ユーザーが数字または単語を入力できるようにしたい場合は、次のように書くことができます。

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

コンマには構文上の意味はありません。これは、$ REPLY変数(ユーザーが実際に入力したもの)または$ opt変数のいずれかでパターンマッチングを行えるようにするためのものです。


selectコマンドが必要break、ではありませんcase
グレン・ジャックマン、2011

ありがとう!それが数値オプションであることを知りませんでした。ああ!
Sumod '09

ああ、私もCでプログラミングしていますbreak。すべてのセクションで必要です。しかし、あなたは必要は決してありませんbreakケース... ESACの中ブロックシェルスクリプト簡単に混同してしまう可能性があります。:-)
にSyntaxError

1
@syntaxerror、あなたは右、あなたは必要ありませんしているbreakためcase。ただし、ループbreakをエスケープするにはが必要selectです。
グレン・ジャックマン2014年

@glenn jackmanこれをもっと役立つコメントに変えたいです(次を参照)。ですから、12:55からコメントを削除することに同意していただければ幸いです。もちろん私も同じようにします。
syntaxerror

3

あなたの$opt変数は、対応するオプション・ワードに設定されます番号そのユーザ入力。ユーザーが実際に入力した内容を見たい場合は、を見てください$REPLY


1
が「apache」、「named」、および「sendmail」caseと比較するとすれば$opt、それは正しく、何も変更する必要はありません。
manatwork '14

@ manatwork、OPがユーザーに1、2、3を押すのではなく、「apache」、「named」、または「sendmail」という単語を入力することを望まない限り
Kusalananda

面白い。$ REPLYを保持1/ 2/ 3、および$ optが保持apache/ named/sendmail
Peter.O

はい、@ fred $REPLYはユーザーが入力したものであり、それが有効な数値である場合$opt、その数値に対応する単語になります。
クサラナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.