Bashスクリプトの2つのメニューを選択

Bashスクリプトの2つのメニューを選択

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$REPLY1$REPLY1$optElvis$optOption 1case$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を使用してread2番目のループで選択プロンプトを設定する代わりに、を使用してバックPS4スラッシュを正しく読み取ることができます。PS3

関連情報