我正在學習 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
並將$opt
是Elvis
。任何時候都$opt
不會Option 1
。它使編寫測試語句比編寫case
測試語句更容易。$REPLY
$opt
另外,現在稱呼對方的名字還為時過早裡面循環select
,因為我們可能仍然不確定它們的真實名稱。當使用者選擇一個語句時,語句末尾case
和循環結束done
之間的程式碼就會運行select
無效的從選單中選擇(您也可以使用*)
案例標籤來執行此操作)。
最好使用更具描述性的變數名稱,例如name
和family
,我們不需要兩個單獨的陣列來儲存選項(事實上,在這種情況下是否需要數組是有問題的,因為我們可以直接列出字元串) 。
在下面的程式碼中,我還使程式碼在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
withread
能夠正確讀取反斜杠,並且在第二個循環中使用PS4
而不是PS3
設置選擇提示。