1. 很多方法 可以读取Bash脚本中的用户输入。 但是,允许用户键入输入会带来一些问题。 主要问题是输入验证,您必须在其中考虑所有可能的输入。 解决此问题的一种简单方法是为Bash脚本创建一个多选菜单。 使用此方法,您可以定义用户可以选择的一组简单的预定选项。
  2.  
  3. 下文,我们将讨论使用 select 语句和 case 语句在Bash脚本中创建简单的多选菜单。
  4.  
  5. 首先,让我们看一个示例多选菜单脚本,然后我们将其分解并解释每个部分。
  6.  
  7. #!/bin/bash
  8. PS3='Choose your favorite food: '
  9. foods=("Pizza" "Pho" "Tacos" "Quit")
  10. select fav in "${foods[@]}"; do
  11. case $fav in
  12. "Pizza")
  13. echo "Americans eat roughly 100 acres of $fav each day!"
  14. # optionally call a function or run some code here
  15. ;;
  16. "Pho")
  17. echo "$fav is a Vietnamese soup that is commonly mispronounced like go, instead of duh."
  18. # optionally call a function or run some code here
  19. ;;
  20. "Tacos")
  21. echo "According to NationalTacoDay.com, Americans are eating 4.5 billion $fav each year."
  22. # optionally call a function or run some code here
  23. break
  24. ;;
  25. "Quit")
  26. echo "User requested exit"
  27. exit
  28. ;;
  29. *) echo "invalid option $REPLY";;
  30. esac
  31. done
  32. 仔细观察以下动图每个选项的选择和输出。 注意选择某些选项后,它如何要求其他选择。 但是,当我们选择Tacos时,它会返回到提示。
  33.  
  34. 多选菜单脚本介绍
  35. 现在,我们来剖析脚本的每个部分。 这将帮助您了解如何创建多项选择菜单,以及如何对其进行编辑以适合您的需求。
  36.  
  37. 第一行是 shebang ,它告诉运行脚本的进程使用哪个解释器。 在这种情况下,它是bash
  38.  
  39. #!/bin/bash
  40. 配置输入提示
  41. 下一行设置 PS3 变量。 这是 select 语句在从我们的多选菜单中进行选择时使用的提示。
  42.  
  43. PS3='Choose your favorite food: '
  44. 创建预定选项列表
  45. 该行创建了一个可供用户选择的选项数组。
  46.  
  47. foods=("Pizza" "Pho" "Tacos" "Quit")
  48. 创建预选菜单
  49. 在这里,我们开始创建菜单的选择构造。 在这一行中,我们告诉 select 选择从foods数组创建菜单。 我们还将在 $fav 变量中设置用户选择。 select 语句的语法类似于 for 循环,这就是为什么您在末尾看到 do 语句的原因。
  50.  
  51. select fav in "${foods[@]}"; do
  52. 使用case语句创建更多可靠的选项
  53. case 语句使您可以有选择地执行与第一个匹配模式相对应的命令。 例如,如果我们从多项选择菜单中选择Pizza,它将执行与该单词相对应的命令列表。
  54.  
  55. case 语句中,我们有开头节。 这告诉案例搜索与 $fav 变量的值匹配的选项。
  56.  
  57. case $fav in
  58. 接下来,我们有一堆子句概述了每个选项。 它从一个或多个要匹配的选项开始,然后在找到匹配项时运行该代码。 我们所有的子句都以 ;; 结尾,这是终止字符串。此子句说明,如果 $fav 的值与Pizza相匹配,请运行 echo 命令。
  59.  
  60. "Pizza")
  61. echo "Americans eat roughly 100 acres of $fav each day!"
  62. # optionally call a function or run some code here
  63. ;;
  64. 在上面的动图,我要求您观察所做的选择以及每个更改的输出。 我想指出的是,每次选择一个选项时,代码都会运行,然后将您带回到 select 循环中。
  65.  
  66. Tacos子句显示了如何添加 break 命令。 这告诉脚本脱离循环。 因此,如果选择Pizza,它将运行与该选择相对应的 echo 命令,然后要求另一个选择(因为没有 break 命令)。 但是,如果选择Tacos,它将运行与Tacos子句相对应的 echo 命令,然后中断循环并继续执行脚本。
  67.  
  68. "Tacos")
  69. echo "According to NationalTacoDay.com, Americans are eating 4.5 billion $fav each year."
  70. # optionally call a function or run some code here
  71. break
  72. ;;
  73. 此行将匹配并告知这是无效的输入。
  74.  
  75. *) echo "invalid option $REPLY";;
  76. 示例:
  77.  
  78. [savona@putor TMP]$ ./test-menu.sh
  79. 1) Pizza
  80. 2) Pho
  81. 3) Tacos
  82. 4) Quit
  83. Choose your favorite food: 8
  84. invalid option 8
  85. Choose your favorite food:
  86. 关闭select循环和case语句
  87. 在所有match子句之后,我们以 esac 结束 case 语句,而 esac 是反写的的。 这类似于以 fi 结束 if 语句。
  88.  
  89. esac
  90. 最后一行关闭用 do 打开的 select 语句。
  91.  
  92. 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】面试题62. 圆圈中最后剩下的数字 解题报告(Python)

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

  2. 【LeetCode】567. Permutation in String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/permutati ...

  3. 问题--ImportError: DLL load failed: 找不到指定的模块

    今天在运行别人的项目时出现了问题: ImportError: DLL load failed: 找不到指定的模块. 解决方法: 卸载后重新安装. 详情参考: Python报错:ImportError: ...

  4. 防止 jar 包被反编译

    1.隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式.例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问 ...

  5. DAGs with NO TEARS: Continuous Optimization for Structure Learning

    DAGs with NO TEARS: Continuous Optimization for Structure Learning 目录 DAGs with NO TEARS: Continuous ...

  6. pandas tutorial

    目录 Series 利用dict来创建series 利用标量创建series 取 Dataframe 利用dict创建dataframe 选择 添加列 列移除 行的选择, 添加, 移除 Panel B ...

  7. pandas tutorial 2

    @ 目录 Group_By 对数据进行分组 对 group进行迭代 选择一个group get_group() Aggregations 在group的基础上传入函数整合 Transformation ...

  8. CS5213高性价比替代AG6200芯片|兼容台湾AG6200芯片|CS5213Capstone

    CS5213是一款HDMI转VGA带音频信号转出的芯片方案,CS5213支持HDCP协议,且外围电路比台湾安格AG6200要少,且本身CS5213芯片成本比AG6200要低,整个方案设计简单性价比较高 ...

  9. ssm项目使用过滤器出现4040错误

    目录 问题 解决方法 (1)方法一 (2)方法二 问题 过滤器处理乱码问题 public class CharFilter implements Filter { @Override public v ...

  10. MySQL支持IPv6

    开启和验证MySQL支持IPv6的方法, 此处使用的MySQL版本为mysql-5.5.35-linux2.6-x86_64. 1.验证操作系统支持IPv6,此处是Linux操作系统 ping6 :: ...