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


    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时,它会返回到提示。

    Animation of Bash multiple choice menu in action

    多选菜单脚本介绍

    现在,我们来剖析脚本的每个部分。 这将帮助您了解如何创建多项选择菜单,以及如何对其进行编辑以适合您的需求。

    第一行是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
    
  • 相关阅读:
    mysql常见的hint
    SQL优化:一篇文章说清楚Oracle Hint的正确使用姿势
    Oracle中常见的Hint(一)
    oracle中hint 详解
    Oracle hint 详解
    neo4j简单学习
    Maven的pom.xml文件结构之基本配置parent和继承结构
    使用TASM编译COFF格式和连接
    使用双引擎,让kbmmw 的客户端访问更方便(既给浏览器做服务,也给桌面程序做服务)
    成大事者不纠结(碰到难办的事情的时候,要就事论事,专注当下,放下过去,不忧未来,也不要记仇。防范之举要节制。是做事情的其中一种策略,而且还要分场合)
  • 原文地址:https://www.cnblogs.com/Rohn/p/14522068.html
Copyright © 2020-2023  润新知