有 很多方法 可以读取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

多选菜单shell脚本的更多相关文章

  1. Shell:如何写一个多选菜单的脚本

    Blog:博客园 个人 翻译自How to Create a Multiple Choice Menu in Bash Scripts 目录 多选菜单脚本介绍 配置输入提示 创建预定选项列表 创建预选 ...

  2. Ubuntu下shell脚本运行异常:bash和dash的区别

    Ubuntu下我用bash到语法写了一个shell脚本(准确的说是把书上的脚本敲进电脑),在ubuntu下,用sh test.sh来运行,但是出现了意料之外到结果,比如echo -e "\n ...

  3. Shell脚本编程具体解释

    第12章 Shell脚本编程   l  Shell命令行的执行 l  编写.改动权限和运行Shell程序的步骤 l  在Shell程序中使用參数和变量 l  表达式比較.循环结构语句和条件结构语句 l ...

  4. buntu下shell脚本运行异常:bash和…

    转载于:http://www.51testing.com/?uid-225738-action-viewspace-itemid-208702 我用bash到语法写了一个shell脚本(准确的说是把书 ...

  5. shell脚本编程(ubantu)

    项目 内容 这个作业属于那个课程 这里是链接 作业要求在哪里 这里是链接 学号-姓名 17041506-张政 作业学习目标 了解shell脚本的概念及使用:掌握shell脚本语言的基本语法:学习简单的 ...

  6. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  9. shell脚本每天自动备份mysql数据库

    一.mysql提供了一个mysqldump的工具可以方便的导出导入数据库信息: 二.使用命令行shell测试执行mysqldump,理解必备的参数,查看生成的sql备份文件是否符合需求: /usr/b ...

随机推荐

  1. 【LeetCode】716. Max Stack 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双栈 日期 题目地址:https://leetcode ...

  2. Flink 实践教程-进阶(5):排序(乱序调整)

    作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接.亚 ...

  3. Deepin20系统安装Nvidia驱动

    Deepin20系统安装Nvidia驱动 系统设备配置信息如下: 电脑型号:华硕天选air[ASUS-FX516P] 显卡型号:RTX 3070 移动版独显 处理器型号: 11th Gen Intel ...

  4. 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行

    需求说明: 使用 Android Studio 开发工具创建一个 Android 应用程序,并在 Genymotion 模拟器上运行 实现步骤: 打开 Android Studio,创建一个 Andr ...

  5. .net core集成使用consul

    快速启动一个consul集群可以参考:使用docker快速部署一个consul集群 .net core集成使用consul是通过consul提供出来api接口来实现的,可以分成两个部分来说明:配置集成 ...

  6. Java时间格式化原来这么多玩法

    时间过得真是快,现在已经是2022年了.作为开发来说,时间处理是非常繁琐的.从Java 8开始有了新的时间API.时间的处理更加优雅,不再需要借助三方类库,而且线程安全.今天来梳理一下新API的格式化 ...

  7. Pytest_测试用例的执行方式(2)

    在pytest框架中,编写测试用例有如下约束: 所有的测试用例文件名都需要满足test_*.py格式或*_test.py格式. 在测试用例文件中,测试类以Test开头,并且不能带有__init__方法 ...

  8. centos7 安装jdk 脚本

    下载安装包 链接:https://pan.baidu.com/s/10-U54WwoEaCC9Afj58owJA 提取码:jdk8 写如脚本 vi ***.sh #!/bin/bash #instal ...

  9. [ flask ] flask-restful 实现嵌套的有关系的输出字段

    问题描述: 1. 先说明数据关系:有用户,和菜谱.一个用户可以拥有多个菜谱:一对多的关系 2.  resources/users.py 的输出字段: user_fields = { 'id':fiel ...

  10. HDOJ3579Hello Kiki

    https://acm.hdu.edu.cn/showproblem.php?pid=3579 一些坑点.首先是如果说最后求得到的结果为0,那么在数学意义上这是正确的,0对于任何的确是最小的整数解,但 ...