编写交互式 Shell 脚本

在日常的系统管理和自动化任务中,使用 Shell 脚本可以为我们节省大量时间和精力。

文章将以输入 IP 为例,通过几个版本逐步完善一个案例。

原始需求

编写一个交互式的 Shell 脚本,运行时让用户可以输入IP地址,并且脚本会将输入的IP地址打印出来。

实现

首先,在命令行终端下创建一个新的文件,比如 i-demo.sh,并确保该文件具有可执行权限。

touch i-demo.sh
chmod +x i-demo.sh

版本一

shell 编程中,read 命令可以在运行时阻塞线程,并等待用户输入。因此脚本可以简单实现如下:

#!/bin/bashread userIPecho "You entered IP : " $userIP

以上代码中 read 命令用于提示用户输入IP地址,并将用户输入存储在变量 userIP 中。随后,echo 命令用于打印出用户输入的IP地址。

版本二

添加提示符 “Please Input IP:”,使得交互比较友好

#!/bin/bashread -p "Please Input IP: " userIPecho "You entered IP: $userIP"

read -p 是 Shell 脚本中用来提示用户输入的命令。它的作用是在用户输入之前,向屏幕上显示一行提示信息,让用户知道他们需要输入什么样的内容。-p 选项表示 prompt(提示),后面紧跟着要显示给用户的提示信息。

版本三

给一个默认值。

#!/bin/bashdefaultIP=127.0.0.1read -p "Please Input IP: " userIPif [ -z $userIP ]; thenuserIP=$defaultIP
fiecho "You entered IP: $userIP"

其中,if [ -z $userIP ] 表示输入为空时,将 userIP 赋值为默认值 defaultIP

另一种实现:

#!/bin/bashdefaultIP=127.0.0.1read -p "Please Input IP: " userIPuserIP=${userIP:-$defaultIP}echo "You entered IP: $userIP"

其中 userIP=${userIP:-$defaultIP} 这行代码将会把 $userIP 的值设置为 $defaultIP 的值,当且仅当 $userIP 未被设置或者为空。这个语法可以用来提供一个默认值,以防止变量为空时的错误。

效果如下:
在这里插入图片描述
其中,第一次输出默认值。第二次输出输入的值。

版本四

在光标处展示默认值,并且支持用户直接编辑

#!/bin/bashdefaultIP=127.0.0.1read -p "Please Input IP (default: $defaultIP): " -e -i "$defaultIP" userIPuserIP=${userIP:-$defaultIP}echo "You entered IP: $userIP"

其中 read 命令后的 -e -i "$defaultIP" 将默认IP放置在了光标处,并支持编辑。

效果如下:
在这里插入图片描述
上图中第一次直接回车,打印了默认值。第二次直接便捷给出的默认IP,回车后打印编辑后的IP.

在这里插入图片描述

版本五

在默认值的基础上添加IP校验,并且校验不通过时,提示再次输入

#!/bin/bashdefaultIP=127.0.0.1# IP 校验函数
function validateIP() {local ip=$1if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; thenlocal IFS=.ip=($ip)(( ${ip[0]} <= 255 && ${ip[1]} <= 255 && ${ip[2]} <= 255 && ${ip[3]} <= 255 ))return $?elsereturn 1fi
}# 提示输入
read -p "Please Input IP (default is $defaultIP): "  -e -i $defaultIP userIP
userIP=${userIP:-$defaultIP}# 校验,若不通过一直循环
while true; doif ! validateIP "$userIP"; thenread -p "Invalid IP format ($userIP). Please try again: " userIPelsebreakfi
done# 打印结果
echo "You entered a valid IP: $userIP"

其中

  • local IFS=. :这行代码中的 IFS 是 Bash shell 中的一个特殊变量,它代表了“Internal Field Separator”(内部字段分隔符),用来指定在 Bash shell 中如何切割字符串。在这行代码中,将 IFS 设置为 . ,意味着告诉 Bash 在处理字符串时,以 . 作为分隔符来切割字符串。

  • ip=($ip): 这行代码使用了 Bash 中的数组赋值语法。它将名为 ip 的字符串分割成一个数组,按照内部字段分隔符(IFS)中指定的字符(在这个例子中是.)进行分割。这意味着,如果 $ip 包含了一个IP地址,那么这个命令会把IP地址中的每一部分分别存储到数组 ip 的不同元素中。
    例如,如果 $ip 的值为 192.168.1.1,那么执行 ip=($ip) 后,数组 ip 的各个元素就会分别存储为 ${ip[0]} = 192, ${ip[1]} = 168, ${ip[2]} = 1, ${ip[3]} = 1

  • (( ${ip[0]} <= 255 && ${ip[1]} <= 255 && ${ip[2]} <= 255 && ${ip[3]} <= 255 )) :这行代码使用了 Bash 中的算术表达式 ((...)),并结合了数组中的值进行了数值比较。
    在这里,${ip[0]}${ip[1]}${ip[2]}${ip[3]} 分别代表了 IP 地址中的四个部分。通过将它们与常量值 255 进行比较,并使用逻辑与运算符 && 来连接所有比较操作,可以确保每个部分都不大于 255。
    因此,整个表达式的含义是:检查 IP 地址的各个部分是否都小于等于 255。如果所有条件都成立,那么整个表达式的结果为真(非零),否则为假(零)。

  • $?: 是在Bash中用来获取上一个命令的退出状态的特殊变量。当执行一个命令后,$? 会保存该命令的退出状态或者返回值。
    通常情况下,如果命令执行成功,则$? 的值为0;如果命令执行失败,则 $? 的值为非零(通常是1)。
    在先前提到的代码中,(( ${ip[0]} <= 255 && ${ip[1]} <= 255 && ${ip[2]} <= 255 && ${ip[3]} <= 255 )) 这个条件表达式执行完毕后,它的返回值将会被保存在 $? 中。因此,可以使用 $? 来检查IP地址校验的结果,如果 $? 的值为0,则表示IP地址合法,否则表示IP地址不合法。

其效果如下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439697.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 过滤器 使用依赖项注入

过滤器是 ASP.NET Core 中的特殊组件&#xff0c;允许我们在请求管道的特定阶段控制请求的执行。这些过滤器在中间件执行后以及 MVC 中间件匹配路由并调用特定操作时发挥作用。 简而言之&#xff0c;过滤器提供了一种在操作级别自定义应用程序行为的方法。它们就像检查点&#…

五粮液的“活窖之美”,探寻“大国浓香”的千年奥秘

执笔 | 尼 奥 编辑 | 扬 灵 “川酒甲天下&#xff0c;精华在宜宾。”酒都宜宾已有4000余年酿酒历史&#xff0c;璀璨的白酒文化孕育了有着“大国浓香、和美五粮、中国酒王”金字招牌的传世名酒五粮液。从盛唐“重碧酒”到宋代“姚子雪曲”&#xff0c;再到“五粮液”&…

外部实体注入漏洞

当允许引用外部实体时&#xff0c;会造成外部实体注入&#xff08;XXE&#xff09;漏洞。通过构造恶意 内容&#xff0c;就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站 等危害。本节介绍针对XXE漏洞的检测和防御方法。 5.2.1 简介 根据回显情况&#x…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch01-2 完整定常系统——杆组RRR

机械原理/机构简图/机构运动学推导/Kmtool.pkg 曲柄滑块机构运动学,五杆机构运动学,七杆机构运动学 本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024…

ANAPF有源电力滤波器选型计算——安科瑞赵嘉敏

配电系统中谐波电流的计算涉及很多因素。对于改造项目&#xff0c;可使用专业电能质量分析仪测得所需谐波数据&#xff1b;对于新建项目&#xff0c;设计人员并不能直接获得供电系统的的谐波数据&#xff0c;因此&#xff0c;我司研发人员通过众多不同行业、不同类型的项目&…

图灵之旅--ArrayList顺序表LinkedList链表栈Stack队列Queue

目录 线性表顺序表ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList的遍历ArrayList的扩容机制利用ArrayList洗牌ArrayList的优缺点 链表链表的实现双向链表的实现 LinkedListLinkedList引入LinkedList的使用LinkedList的构造LinkedList的常用方法介绍Lin…

Flink问题解决及性能调优-【Flink根据不同场景状态后端使用调优】

Flink 实时groupby聚合场景操作时&#xff0c;由于使用的是rocksdb状态后端&#xff0c;发现CPU的高负载卡在rocksdb的读写上&#xff0c;导致上游算子背压特别大。通过调优使用hashmap状态后端代替rocksdb状态后端&#xff0c;使吞吐量有了质的飞跃&#xff08;20倍的性能提升…

华为手表开发:WATCH 3 Pro(5)点击按钮弹窗

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;5&#xff09;点击按钮弹窗 初环境与设备 创建项目认识目录结构 修改首页 -> 新建按钮 “ 按钮 ” 文件名&#xff1a;**index.hml** 引用包&#xff1a;‘system.prompt’点击结果 初 鸿蒙可穿戴开发 希望能写一些简…

Spring:JDBCTemplate 的源码分析

一&#xff1a;JdbcTemplate的简介 JdbcTemplate 是 Spring Template设置模式中的一员。类似的还有 TransactionTemplate、 MongoTemplate 等。通过 JdbcTemplate 我们可以使得 Spring 访问数据库的过程简单化。 二&#xff1a;执行SQL语句的方法 1&#xff1a;在JdbcTempla…

手把手教你使用Python打造绚丽的词云图

目录 一、引言 二、环境准备 三、基本流程 四、代码实现 五、进阶技巧与优化 六、总结 一、引言 在信息时代&#xff0c;数据可视化已经成为信息传递的重要手段。词云图作为数据可视化的一种形式&#xff0c;能够直观地展示文本数据中的关键词和重要信息。通过使用Pytho…

故障诊断 | 一文解决,LSTM长短期记忆神经网络故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现LSTM长短期记忆神经网络故障诊断 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

142. 环形链表 II(力扣LeetCode)

文章目录 142. 环形链表 II题目描述解题思路判断链表是否有环如果有环&#xff0c;如何找到这个环的入口 c代码 142. 环形链表 II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个…