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、2、または3ですよね?
回答
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
コマンドには、case
ではなくbreak
が必要です。 - ありがとうございます。数値オプションだとは思いませんでした。
- ああ、私もCでプログラムしているので、すべてのセクションに
break
が必要です。 ただし、シェルスクリプトの case … esac ブロックにbreak
が必要になることはありません。それらを混同するのはとても簡単に起こり得ます。 🙂 - @syntaxerror、あなたは'正解です、'はivid = “は必要ありません
case
の場合はeefe9e6ecf “>
。ただし、select
ループをエスケープするにはbreak
が必要です。
回答
あなたの$opt
変数は、ユーザーが入力した番号に対応するオプションワードに設定されます。ユーザーが実際に入力した内容を確認したい場合は、$REPLY
を確認してください。
コメント
-
case
が$opt
を" apache "、"名前"および" sendmail "、それは正しく、何も変更する必要はありません。 - @ manatwork、OPがユーザーに"という単語の入力を要求しない限りapache "、"名前"または" sendmail "。
- 興味深い。 $ REPLYは
1
/2
/3
を保持し、$ optはapache
/named
/sendmail
- @fred、はい、
$REPLY
はユーザーが入力したものであり、有効な番号の場合、$opt
はその番号に対応する単語になります。