我正在学习 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
设置选择提示。