首页 > 系统相关 >shell select命令语句 用户多选

shell select命令语句 用户多选

时间:2023-08-18 14:12:10浏览次数:48  
标签:echo shell 多选 selChoices choices select choice 输入

select命令语句,默认只能输入一个选择项。但有时候需要让用户输入多个 选项,就需要加for循环处理多选项了。

一、示例代码

#!/usr/bin/env bash

choices=( 'one' 'two' 'three' 'four' 'five' ) # sample choices
select dummy in "${choices[@]}"; do  # present numbered choices to user
  # Parse ,-separated numbers entered into an array.
  # Variable $REPLY contains whatever the user entered.
  IFS=', ' read -ra selChoices <<<"$REPLY"
  # Loop over all numbers entered.
  for choice in "${selChoices[@]}"; do
    # Validate the number entered.
    (( choice >= 1 && choice <= ${#choices[@]} )) || { echo "Invalid choice: $choice. Try again." >&2; continue 2; }
    # If valid, echo the choice and its number.
    echo "Choice #$(( ++i )): ${choices[choice-1]} ($choice)"
  done
  # All choices are valid, exit the prompt.
  break
done

echo "Done."

执行效果:输入 1 2 3

image
输入用什么分隔符,在 IFS 变量中控制,下文会说明


二、说明

至于select命令通常如何工作,只需一个选择:

运行man bash并查看"复合命令"标题下的内容
有关带注释的示例,请参阅此答案.
这个答案实现了如下定制逻辑:

select命令的指定目标变量dummy,,被忽略,$REPLY而是使用变量,因为Bash将其设置为用户输入的任何内容(未经验证).
IFS=', ' read -ra selChoices <<<"$REPLY" 标记用户输入的值:
它通过here-string(<<<)传递给read命令
使用逗号和space(,<space>)实例作为[Internal] Field Separator(IFS=...)
请注意,作为副作用,用户只能使用空格来分隔他们的选择.
并将生成的标记存储为array(-a)的元素selChoices; -r简单地关掉\字符的解释.在输入中
for choice in "${selChoices[@]}"; do 循环遍历所有标记,即用户选择的单个数字.
(( choice >= 1 && choice <= ${#choices[@]} )) || { echo "Invalid choice: $choice. Try again." >&2; continue 2; } 确保每个令牌有效,即它是介于1和所呈现的选择计数之间的数字.
echo "Choice #$(( ++i )): ${choices[choice-1]} ($choice)" 输出每个选项和选项号
前缀为运行索引(i),++i使用算术扩展($((...)))递增()- 因为变量默认为0算术上下文,第一个索引输出将是1;
接着是${choices[choice-1]},即由输入的数字表示的选择字符串,递减1,因为Bash数组是0基于的; 注意如何在数组下标中choice不需要$前缀,因为下标是在算术上下文中计算的(就像在里​​面一样$(( ... ))),如上所述.
($choice)在括号中选择的数字终止.
break需要退出提示; 默认情况下,select会继续提示.





参考、来源:
https://qa.1r1g.com/sf/ask/2128520901/



标签:echo,shell,多选,selChoices,choices,select,choice,输入
From: https://www.cnblogs.com/wutou/p/17640327.html

相关文章

  • jquery.nice-select 教程
    jQueryNiceSelect是一个基于jQuery的优雅选择框插件,它可以美化网页中的下拉选择框。下面是使用jQueryNiceSelect的基本步骤:引入jQuery和jQueryNiceSelect:在你的HTML文件中,首先需要引入jQuery和jQueryNiceSelect的脚本文件。你可以从官方网站下载最新版本的......
  • shell 学习之文本处理工具
    视频:07_小工具使用diff【正常模式】_哔哩哔哩_bilibili1.grep 2.cut 3.sort  4.uniq 5.tee从标准输入读取并写到标准输出和文件,即双向覆盖重定向(屏幕输出/文本输入)。 6.diff 逐行比较文件的不同。 语法:diff[选项]file1file2 1)正常显示......
  • linux shell wc统计文件行数
    语法:wc[选项]文件…说明:该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字符区分开的最大字符串。该命令各选项含义如下:-c统计字节数。-l统计行数。-w统计字数。这些选项可以......
  • vue-treeselect 树下拉组件被遮挡问题
    vue-treeselect组件官方中文网站: https://www.vue-treeselect.cn/需求背景:在el-tabs内容中添加此组件出现被遮挡问题通过文档查询解决方法<treeselectv-model="params.wardIds":options="hospitalWardTree"value-consists-of="LEAF_PRIORITY"placeholder=......
  • shell 编程 命令
    #!/bin/shshell编程的头文件echo“$0”返回的是这个脚本的部分路径echo“$1”返回的第一个参数echo“$2”返回的第二个参数echo“$*”返回的是全部参数echo“$#”返回的是参数的个数read-p“请输入你的名字:”usernameecho$usernameread-t60-p"请输入数字:"ab......
  • xshell隧道SOCKET代理
    访问数据流本地浏览器->本地代理->linux隧道服务器->真实服务隧道代理chrome安装插件SwitchyOmegahttps://pan.baidu.com/s/1O9gDwDLK906G-i2G3hmSug?pwd=gkkglinkshttps://www.cnblogs.com/lq0710/p/16631218.htmlhttps://www.bbsmax.com/A/QV5ZyqwbJy/https......
  • 30个shell脚本简单示例
    30个简单且常用的LinuxShell脚本命令及示例,有用~~时代Java 2023-08-1807:40 发表于北京↑ 点击上面 “时代Java”关注我们,关注新技术,学习新知识!shell一直是类Unix系统的本地命令行解释器。它已被证明是Unix的主要功能之一,并发展成为一个全新的主题。Linux提供了各......
  • Linux Shell下awk,sed,cut的常用方法并在自动化运维脚本中联合运用
    AWK处理工具,它可以用于提取、处理和格式化文本数据。它的主要功能是逐行扫描文件,并根据匹配模式执行操作。AWK具有以下主要特点:读取和处理文本文件中的数据根据匹配模式执行操作逐行扫描文件打印指定的列在自动化运维脚本中,AWK可以用于处理日志文件,例如提取特定行的数据、从日志文......
  • shell脚本之免交互expect
    目录1.多行重定向2.Expect3.awk数组4.去除重复行实例1.多行重定向cat<<EOF#打印在屏幕上cat<<a.txt#不打印在屏幕上[root@localhost~]#cat<<EOF>HELLO>HI>OK>EOFHELLOHIOK[root@localhost~]#cat<<EOF>test#传给testHELLOHIOKEOF[r......
  • 为什么 cl_gui_dialogbox_container 只能在 at selection output 事件中使用
    首先,我们来了解一下cl_gui_dialogbox_container类。这是SAP的一个类,用于创建一个对话框容器,通常用于在对话框中显示一些GUI控件,例如:图形、控件等。cl_gui_dialogbox_container对象主要用于在模态对话框中创建自定义容器,它允许我们将GUI控件(如ALVGRID,HTMLViewer等)嵌入......