Shell:如何写一个多选菜单的脚本
有很多方法可以读取Bash脚本中的用户输入。 但是,允许用户键入输入会带来一些问题。 主要问题是输入验证,您必须在其中考虑所有可能的输入。 解决此问题的一种简单方法是为Bash脚本创建一个多选菜单。 使用此方法,您可以定义用户可以选择的一组简单的预定选项。
下文,我们将讨论使用select
构造和case
语句在Bash脚本中创建简单的多选菜单。
首先,让我们看一个示例多选菜单脚本,然后我们将其分解并解释每个部分。
#!/bin/bash
PS3='Choose your favorite food: '
foods=("Pizza" "Pho" "Tacos" "Quit")
select fav in "${foods[@]}"; do
case $fav in
"Pizza")
echo "Americans eat roughly 100 acres of $fav each day!"
# optionally call a function or run some code here
;;
"Pho")
echo "$fav is a Vietnamese soup that is commonly mispronounced like go, instead of duh."
# optionally call a function or run some code here
;;
"Tacos")
echo "According to NationalTacoDay.com, Americans are eating 4.5 billion $fav each year."
# optionally call a function or run some code here
break
;;
"Quit")
echo "User requested exit"
exit
;;
*) echo "invalid option $REPLY";;
esac
done
仔细观察以下动图每个选项的选择和输出。 注意选择某些选项后,它如何要求其他选择。 但是,当我们选择Tacos时,它会返回到提示。
多选菜单脚本介绍
现在,我们来剖析脚本的每个部分。 这将帮助您了解如何创建多项选择菜单,以及如何对其进行编辑以适合您的需求。
第一行是shebang
,它告诉运行脚本的进程使用哪个解释器。 在这种情况下,它是bash。
#!/bin/bash
配置输入提示
下一行设置PS3变量。 这是select
语句在从我们的多选菜单中进行选择时使用的提示。
PS3='Choose your favorite food: '
创建预定选项列表
该行创建了一个可供用户选择的选项数组。
foods=("Pizza" "Pho" "Tacos" "Quit")
创建预选菜单
在这里,我们开始创建菜单的选择构造。 在这一行中,我们告诉select
选择从foods数组创建菜单。 我们还将在$fav
变量中设置用户选择。 select构造的语法类似于for循环,这就是为什么您在末尾看到do
语句的原因。
select fav in "${foods[@]}"; do
使用case语句创建更多可靠的选项
case
语句使您可以有选择地执行与第一个匹配模式相对应的命令。 例如,如果我们从多项选择菜单中选择Pizza,它将执行与该单词相对应的命令列表。
在case语句中,我们有开头节。 这告诉案例搜索与$fav
变量的值匹配的选项。
case $fav in
接下来,我们有一堆子句概述了每个选项。 它从一个或多个要匹配的选项开始,然后在找到匹配项时运行该代码。 我们所有的子句都以;;
结尾,这是终止字符串。此子句说明,如果$fav
的值与Pizza相匹配,请运行echo
命令。
"Pizza")
echo "Americans eat roughly 100 acres of $fav each day!"
# optionally call a function or run some code here
;;
在上面的动图,我要求您观察所做的选择以及每个更改的输出。 我想指出的是,每次选择一个选项时,代码都会运行,然后将您带回到select
循环中。
Tacos子句显示了如何添加break
命令。 这告诉脚本脱离循环。 因此,如果选择Pizza,它将运行与该选择相对应的echo
命令,然后要求另一个选择(因为没有break命令)。 但是,如果选择Tacos,它将运行与Tacos子句相对应的echo
命令,然后中断循环并继续执行脚本。
"Tacos")
echo "According to NationalTacoDay.com, Americans are eating 4.5 billion $fav each year."
# optionally call a function or run some code here
break
;;
此行将匹配并告知这是无效的输入。
*) echo "invalid option $REPLY";;
示例:
[savona@putor TMP]$ ./test-menu.sh
1) Pizza
2) Pho
3) Tacos
4) Quit
Choose your favorite food: 8
invalid option 8
Choose your favorite food:
关闭select循环和case语句
在所有match子句之后,我们以esac
结束case
语句,而esac
是反写的的。 这类似于以fi
结束if
语句。
esac
最后一行关闭用do
打开的select
语句。
done
最新文章
- win10连vpn
- apachetop 实时监控apache指定日志
- vmware workstation unrecoverable error: (vmui)报错解决方法
- JavaScript中reduce()方法
- JS通过身份证号码获取出生年月日
- 学习JQ
- B. Santa Claus and Keyboard Check 模拟
- form表单元素类型
- h5 web模板
- Access数据库数据转换Table.Json
- 获取sdcard和内存的存储空间
- 开子线程下载图片,回到主线程刷新UI步骤
- L2-007 家庭房产 (25 分) (并查集)
- Javascript高级编程学习笔记(85)—— Canvas(2)2D上下文
- IIS的UrlRewrite模块
- 解决git commit 大文件推送失败
- 【管用】 使用VMtools实现主机Windows与虚拟机Linux文件共享
- Session 在分布式系统中实现方式
- oracle数据库将一列的值拼接成一行,并且各个值之间用逗号隔开
- 【Selenium-WebDriver自学】Selenium-IDE模式匹配(六)