Bash 腳本中的兩個選單選擇

Bash 腳本中的兩個選單選擇

我正在學習 Bash,並正在嘗試解決一個練習。

練習包括從選單清單中選擇名字和姓氏。但是,如果該名稱不在清單中,則設定手動輸入。

但我有點困惑,因為當一個選項被選擇時,我不選擇如何進入第二個選單,而沒有選擇選項“退出”(我嘗試在任何選項中添加“中斷”,但不起作用)。

對於手動輸入,您嘗試讀取用戶的輸入,但沒有看到任何建議?

當我得到名字和姓氏時,如何終止循環?因為當我同時獲得兩者時,我會進入同一個循環。

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並將$optElvis。任何時候都$opt不會Option 1。它使編寫測試語句比編寫case測試語句更容易。$REPLY$opt

另外,現在稱呼對方的名字還為時過早裡面循環select,因為我們可能仍然不確定它們的真實名稱。當使用者選擇一個語句時,語句末尾case和循環結束done之間的程式碼就會運行select無效的從選單中選擇(您也可以使用*)案例標籤來執行此操作)。

最好使用更具描述性的變數名稱,例如namefamily,我們不需要兩個單獨的陣列來儲存選項(事實上,在這種情況下是否需要數組是有問題的,因為我們可以直接列出字元串) 。

在下面的程式碼中,我還使程式碼在exit用戶選擇時終止Quitbreak退出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"

其他修復的小問題:使用-rwithread能夠正確讀取反斜杠,並且在第二個循環中使用PS4而不是PS3設置選擇提示。

相關內容