"select"コマンドを使用してBashの印刷メニュー

このコマンドを使用して簡単なメニューを実装しようとしています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 "*********************"

スクリプトは私が提供した有効な入力を認識せず、常に「無効なオプション」メッセージを出力します。このスクリプトで私が何を間違っているのでしょうか?

ベストアンサー1

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変数でパターンマッチングを有効にするだけです。

おすすめ記事