このコマンドを使用して簡単なメニューを実装しようとしています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変数でパターンマッチングを有効にするだけです。
答え2
変数$opt
は次のように設定されます。数字ユーザー入力。ユーザーが実際に入力した内容を表示するには、をご覧ください$REPLY
。