Bashを学んでいて、練習問題を解決しようとしています。
この演習には、メニューリストから名前と姓を選択することが含まれます。ただし、名前がリストにない場合は手動入力が設定されます。
しかし、1つのオプションを選択すると、「Exit」オプションを選択せず、2番目のメニューに移動する方法を選択しないため、少し混乱します。 (任意のオプションに「Break」を追加しようとしましたが、機能しません)。
手動入力の場合、ユーザー入力を読み取ろうとしましたが、提案が表示されませんでしたか?
名前と姓を取得するときにループを終了するにはどうすればよいですか?どちらも取得すると同じループに陥るからです。
echo -e "Choose your name Exercise #2 \n"
PS3='Please enter your name from the List: '
options=("Elvis" "John" "Mark" "Manual Input" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
;;
"Option 2")
;;
"Option 3")
;;
"Option 4")
echo "Sorry your Name is not in the List Give your name"
read -e -p "Whats your name: " MANUALINPUT
;;
"Quit")
break
;;
esac
echo "Hello $opt Next Step is Select your Lastname "
done
PS4='Please enter your last name from the List: '
options2=("Smith" "Brown" "Miller" "Manual Input" "Quit")
select opt2 in "${options2[@]}"
do
case $opt2 in
"Option 1")
;;
"Option 2")
;;
"Option 3")
;;
"Option 4")
echo "Sorry your Name is not in the List Give your name"
read -e -p "Whats your name: " MANUALINPUT
;;
"Quit")
break
;;
esac
clear
echo "Welcome $opt $opt2"
done
答え1
ループはユーザーが選択したオプションに設定され、select
ユーザーが入力したオプションに設定されます。したがって、ユーザーが最初の質問に対する回答を入力したときになります。いつでもありません。作成するよりもテスト用のステートメントを作成する方が簡単です。opt
$REPLY
1
$REPLY
1
$opt
Elvis
$opt
Option 1
case
$REPLY
$opt
しかも相手の名前を呼ぶにはまだ早い。~へloop select
、まだ実際の名前がわからないことがあるからです。ユーザーがステートメントを選択すると、ステートメントの終わりcase
とループの終わりの間done
のコードが実行されます。select
無効メニューから選択します(*)
これを行うにはケースタグを使用することもできます)。
name
など、より説明的な変数名を使用することをお勧めします。family
オプションを保存するために2つの別々の配列は必要ありません。 (事実この場合、文字を直接リストできるので配列が必要かどうか疑問です。ひも)。
以下のコードでは、ユーザーがexit
選択したときにコードが終了するように作成しましたQuit
(ユーザーが名前を正常に選択するときに使用するループをbreak
終了します)。select
通常、すべての対話型会話は標準エラーストリームで発生します。
#!/bin/bash
PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
case $REPLY in
1|2|3)
break # user picked name from list
;;
4)
echo 'Sorry your name is not in the list' >&2
read -e -r -p "What's your name: " name
break
;;
5)
echo 'Bye!' >&2
exit
;;
esac
echo 'Try again!' >&2
done
printf 'Hello %s, now select your family name\n' "$name" >&2
PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
case $REPLY in
1|2|3)
break # user picked name from list
;;
4)
echo 'Sorry your family is not in the list' >&2
read -e -r -p "What's your family: " family
;;
5)
echo 'Bye!' >&2
exit
;;
esac
echo 'Try again!' >&2
done
printf 'Welcome, %s %s!\n' "$name" "$family"
-r
その他のマイナーな修正:withを使用してread
2番目のループで選択プロンプトを設定する代わりに、を使用してバックPS4
スラッシュを正しく読み取ることができます。PS3