编写交互式 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.mzph.cn/news/662560.shtml

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

相关文章

国辰智企TMS定制化模块,实现智慧园区的全面管理

智慧园区综合管理系统是一种针对园区业务场景的高度定制化解决方案&#xff0c;通过选择性部署相应的模块&#xff0c;实现对园区各方面业务的全面管理。通常情况下&#xff0c;园区都需要有效地管理资产、确保安全&#xff0c;以及进行访客预约。这一全面性的系统通过各个模块…

每日一题 力扣2670找出不同元素数目差数组

2670. 找出不同元素数目差数组 题目描述&#xff1a; 给你一个下标从 0 开始的数组 nums &#xff0c;数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示&#xff0c;其中 diff[i] 等于前缀 nums[0, ..., i] 中不同元素的数目 减去 后缀 num…

安装配置hive

1、下载 上传apache-hive-2.3.7-bin.tar.gz到虚拟机/root目录下或在虚拟机正常联网的情况下使用下面的wget命令下载文件。 [root@hadoop00 ~]# wget -c https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-2.3.7/apache-hive-2.3.7-bin.tar.gz [root@hadoop00 ~]# tar zx…

windows 谷歌浏览器Chrome 怎么禁止更新

1.首先把任务管理器里的谷歌浏览器程序结束&#xff1a; &#xff08;鼠标在任务栏右击&#xff0c;出现任务管理器&#xff09; 2.windowr&#xff0c;输入services.msc 带有Google Update的服务&#xff0c;选择禁用。 3.windowr&#xff0c;输入taskschd.msc 任务计划程序…

二叉搜索树,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 代码补充说明&#xff1a; 代码实现(中序遍历)&#xff1a; 题目地址&#xff1a; 98. 验证二叉搜索树 - 力扣&#xff08;LeetCod…

delete、truncate和drop区别

一、从执行速度上来说 drop > truncate >> DELETE 二、从原理上讲 1、DELETE DELETE from TABLE_NAME where xxx1.1、DELETE属于数据库DML操作语言&#xff0c;只删除数据不删除表的结构&#xff0c;会走事务&#xff0c;执行时会触发trigger&#xff08; 触发器…

8. 字符串转换整数 (atoi)-LeetCode(Java)

8. 字符串转换整数 (atoi) 题目&#xff1a;8. 字符串转换整数 (atoi) 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入…

AI大语言模型学习笔记之三:协同深度学习的黑魔法 - GPU与Transformer模型

Transformer模型的崛起标志着人类在自然语言处理&#xff08;NLP&#xff09;和其他序列建模任务中取得了显著的突破性进展&#xff0c;而这一成就离不开GPU&#xff08;图形处理单元&#xff09;在深度学习中的高效率协同计算和处理。 Transformer模型是由Vaswani等人在2017年…

2024美赛预测算法 | 回归预测 | Matlab基于WOA-LSSVM鲸鱼算法优化最小二乘支持向量机的数据多输入单输出回归预测

2024美赛预测算法 | 回归预测 | Matlab基于WOA-LSSVM鲸鱼算法优化最小二乘支持向量机的数据多输入单输出回归预测 目录 2024美赛预测算法 | 回归预测 | Matlab基于WOA-LSSVM鲸鱼算法优化最小二乘支持向量机的数据多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果…

Git 指令

Git 安装 操作 命令行 简介&#xff1a; Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion …

2024PMP考试新考纲-【业务环境领域】典型真题和很详细解析(2)

华研荟继续分享【业务环境Business Environment领域】在新考纲下的真题&#xff0c;帮助大家体会和理解新考纲下PMP的考试特点和如何应用所学的知识和常识&#xff08;经验&#xff09;来解题&#xff0c;并且举一反三&#xff0c;一次性3A通过2024年PMP考试。 2024年PMP考试新…

准确率90%+!大模型会话洞察平台来了

随着客户行为和需求加速改变&#xff0c;企业与客户在数字渠道沟通并交易的比重大幅提升。企业通过在线客服、社交媒体、短信、语音助手等数字化渠道与客户建立联系的方式&#xff0c;不仅拓宽了沟通途径&#xff0c;更显著提高了服务效率和质量。 与此同时&#xff0c;数字化…

POSIX(包含程序的可移植性) -- 详解

1. 什么是 POSIX 参考链接–知乎 POSIX 标准包含了进程管理、文件管理、网络通信、线程和同步、信号处理等方面的功能。 这些接口定义了函数、数据类型和常量等&#xff0c;为开发者提供了一个可移植的方法来与操作系统进行交互。 2. 谁遵守这个标准 遵守 POSIX 标准的主要是…

【WPF.NET开发】优化性能:二维图形和图像处理

本文内容 绘图和形状StreamGeometry 对象DrawingVisual 对象映像 WPF 提供了多种可按应用程序要求进行优化的 2D 图形和图像处理功能。 本主题提供有关这些方面性能优化的信息。 1、绘图和形状 WPF 提供 Drawing 和 Shape 对象来表示图形绘制内容。 但是&#xff0c;Drawin…

Python——将Pyaudio的frame音频数据转换成wave格式

要将pyaudio捕获的音频帧&#xff08;frame&#xff09;数据转换成wave模块可以直接处理的格式&#xff0c;通常意味着你需要将这些音频帧数据组装成一个完整的音频流&#xff0c;并确保它们以wave模块期望的格式进行存储。但是&#xff0c;如果你的目的是将这些帧数据直接转换…

蛋氨酸市场调研:预计2029年将达到87亿美元

蛋氨酸&#xff0c;又名甲硫氨酸&#xff0c;化学名称为γ-甲硫基-a-氨基丁酸&#xff0c;是一种参与蛋白质合成的基本结构单位&#xff0c;是人体内八种必需氨基酸之一&#xff0c;同时也是重要的饲料添加剂。蛋氨酸主要用于家禽、猪的饲料添加剂以及药用等。对禽类来说&#…

adb脚本操作

用荣耀80手机测试 echo off setlocal enabledelayedexpansion adb shell am start com.android.settings timeout /t 2 /nobreak >nul adb shell input tap 500 1300 timeout /t 2 /nobreak >nul adb shell input tap 500 800 timeout /t 2 /nobreak >nul adb she…

ElasticSearch搜索与分析引擎-Linux离线环境安装教程

目录 一、下载安装包 网盘链接: 二、安装流程及遇到的问题和解决方案 &#xff08;1&#xff09;JDK安装 &#xff08;2&#xff09;Elasticsearch安装 &#xff08;3&#xff09;Kibana安装 ​&#xff08;4&#xff09;Ik分词器安装 三、启动过程中的问题 &#xff…

linux查看mysql状态重启

1.linux怎么看mysql数据库是不是宕机了&#xff1f; MySQL/MariaDB数据库的状态&#xff1a;使用systemctl status mysql或者service mysqld status命令。如果显示"active (running)"表示MySQL正常运行&#xff1b;如果显示"inactive (dead)"则表示MySQL已…

ASP.NET Core WebAPI_解决跨域问题(前端后端)

说明 我的前端框架为Vue&#xff13; 前后端跨域选其一即可 前端跨域 在项目的根目录找到vite.config.js文件&#xff0c;添加代码&#xff1a; server: {proxy: {/api: {target: https://localhost:xxxx,changeOrigin: true,secure: false},},} axios代码片段&#xff1a; …