Blog:博客园 个人

翻译自How to Create a Multiple Choice Menu in Bash Scripts

很多方法可以读取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. 写一个带文本菜单的程序,菜单项如下 (1) 取五个数的和 (2) 取五个数的平均值 (X) 退出。

    问题: 写一个带文本菜单的程序,菜单项如下(1)    取五个数的和 (2)     取五个数的平均值(X)    退出. 由用户做一个选择, 然后执行相应的功能.当用户选择退出时程序结束. 实现: ...

  2. 用JS写一个网站树形菜单

    先上效果图: 主体内容就是侧边展示的一二三级菜单,树形结构的. 前端页面布局内容,页面内容简单用ul li 来完成所有的罗列项.用先后顺序来区分一级二级三级: <body> <b&g ...

  3. 利用vue写一个复选框的组件

    HTML <multicheck :source=tlist :busValue='objInfo.tt' @getTt="getTtInfo"></multic ...

  4. python 写一个类似于top的监控脚本

    最近老板给提出一个需要,项目需求大致如下:      1.用树莓派作为网关,底层接多个ZigBee传感节点,网关把ZigBee传感节点采集到的信息通过串口接收汇总,并且发送给上层的HTTP Serve ...

  5. 多选菜单shell脚本

    有 很多方法 可以读取Bash脚本中的用户输入. 但是,允许用户键入输入会带来一些问题. 主要问题是输入验证,您必须在其中考虑所有可能的输入. 解决此问题的一种简单方法是为Bash脚本创建一个多选菜单 ...

  6. [python] 1、python鼠标点击、移动事件应用——写一个自动下载百度音乐的程序

    1.问题描述: 最近百度总爱做一些破坏用户信任度的事——文库金币变券.网盘限速,吓得我赶紧想办法把存在百度云音乐中的歌曲下载到本地. http://yinyueyun.baidu.com/ 可问题是云 ...

  7. 如何写一个简单的shell

    如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...

  8. 写一个shell 快速启动停止你的微服务吧

    在这个微服务盛行的时代,docker获得了巨大的成功,因为我们需要在一台服务器装上N个服务. 本文不是想讨论如何使用docker,而是,在一台服务器安装了多个服务后,怎样启动方便的启动服务呢? 一.在 ...

  9. 自己写一个chrome扩展程序 - 右键菜单扩展

    最近在学习Spring,心想dotnet如何实现类似形式呢.于是想认真学习Casetle组件,发现没有书籍!而spring的书多得很.于是只好找网上教程了.发现系统的文章不多.Terrylee好多文章 ...

随机推荐

  1. SpringBoot 启动慢的解决办法

    项目集成了很多内容,有 700 多个类,IDEA 中启动一次需要 70 秒,非常影响开发效率. 研究问题原因发现有以下几种情况会导致启动速度慢,优化后启动只需 26 秒左右了: 1. 和网卡有关,禁用 ...

  2. kubernetes实战-配置中心(一)configmap资源

    在我们的环境中测试使用configmap资源,需要先对我们的环境进行一些准备,首先将dubbo服务调整为0个pod ,然后把zookeeper进行拆分: 拆分zk环境,模拟测试环境跟生产环境: 停止z ...

  3. Leetcode(17)-电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...

  4. USB2.0协议学习笔记---USB数据包结构

    USB包类型和传输过程  USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同 ...

  5. Excel 如何固定表头

    Excel 如何固定表头 视图-冻结窗格-冻结首行 EXCEL如何设置固定表头 一.首先打开Excel表格,如果你的表头只有一行,那么直接选择"视图-冻结窗格-冻结首行"就可以了. ...

  6. H.265 & H.264

    H.265 & H.264 HEVC (H.265) vs. AVC (H.264) https://en.wikipedia.org/wiki/High_Efficiency_Video_C ...

  7. ts 在Function上创建静态属性和方法

    interface IMessage { (value: any): void; success(): void; error(): void; version: string; } const Me ...

  8. windows10 安装NASM

    NASM官网 下载NASM NASM在线HTML文档 下载golink golink文档 NASM教程 in windows x64调用约定 x86调用约定 编码样式约定 在编写nasm时数字默认为1 ...

  9. VS Code使用Git可视化管理源代码详细教程

    前言: 随着VS Code的功能和插件的不断强大和完善,它已经成为了我们日常开发中一个必不可缺的伙伴了.在之前我曾经写过一篇SourceTree使用教程详解(一个git可视化管理神器,想要了解的话可以 ...

  10. 基于nginx实现上游服务器动态自动上下线——不需reload

    网上关于nginx的介绍有很多,这里讲述的是上游服务(如下图的Java1服务)在没有"网关"的情况下,如何通过nginx做到动态上下线. 传统的做法是,手动修改nginx的upst ...