shell脚本(4)一文解决比较运算符用户交互
免责声明
学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。
笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。
比较运算符
在Shell脚本中,比较运算符用于比较两个值并返回一个布尔值(真或假)。以下是一些常见的比较运算符及其用法:
数值比较运算符
这些运算符用于比较整数或浮点数。
-
-eq:等于 -
-ne:不等于 -
-lt:小于 -
-le:小于等于 -
-gt:大于 -
-ge:大于等于
#!/bin/bashnum1=10
num2=20if [ $num1 -eq $num2 ]; thenecho "num1 等于 num2"
elif [ $num1 -ne $num2 ]; thenecho "num1 不等于 num2"
fiif [ $num1 -lt $num2 ]; thenecho "num1 小于 num2"
fiif [ $num1 -le $num2 ]; thenecho "num1 小于等于 num2"
fiif [ $num1 -gt $num2 ]; thenecho "num1 大于 num2"
fiif [ $num1 -ge $num2 ]; thenecho "num1 大于等于 num2"
fi
字符串比较运算符
这些运算符用于比较字符串。
-
=:相等 -
!=:不相等 -
<:小于(按字典顺序) -
>:大于(按字典顺序) -
-z:检查字符串是否为空
#!/bin/bashstr1="hello"
str2="world"if [ "$str1" = "$str2" ]; thenecho "str1 等于 str2"
elif [ "$str1" != "$str2" ]; thenecho "str1 不等于 str2"
fiif [ "$str1" \< "$str2" ]; thenecho "str1 小于 str2"
fiif [ "$str1" \> "$str2" ]; thenecho "str1 大于 str2"
fiif [ -z "$str1" ]; thenecho "str1 是空字符串"
elseecho "str1 不是空字符串"
fi
文件比较运算符
这些运算符用于比较文件的状态或属性。
-
-e:文件存在 -
-d:文件是目录 -
-f:文件是普通文件 -
-r:文件可读 -
-w:文件可写 -
-x:文件可执行 -
-s:文件非空 -
-O:文件属于当前用户 -
-G:文件的组ID与当前用户相同 -
-nt:文件1比文件2新 -
-ot:文件1比文件2旧
#!/bin/bashfile1="file1.txt"
file2="file2.txt"if [ -e "$file1" ]; thenecho "file1 存在"
fiif [ -d "$file1" ]; thenecho "file1 是目录"
fiif [ -f "$file1" ]; thenecho "file1 是普通文件"
fiif [ -r "$file1" ]; thenecho "file1 可读"
fiif [ -w "$file1" ]; thenecho "file1 可写"
fiif [ -x "$file1" ]; thenecho "file1 可执行"
fiif [ -s "$file1" ]; thenecho "file1 非空"
fiif [ -O "$file1" ]; thenecho "file1 属于当前用户"
fiif [ -G "$file1" ]; thenecho "file1 的组ID与当前用户相同"
fiif [ "$file1" -nt "$file2" ]; thenecho "file1 比 file2 新"
fiif [ "$file1" -ot "$file2" ]; thenecho "file1 比 file2 旧"
fi
注意事项
-
在比较字符串时,建议将变量放在双引号中,以防止空格和其他特殊字符引起的问题。
-
在比较数值时,不需要使用双引号。
-
字符串比较时,
<和>需要转义,否则会被解释为重定向操作符。
应用场景
在Shell脚本中,比较运算符被广泛应用于各种场景,以实现条件判断和逻辑控制。以下是一些常见的使用场景:
1. 输入验证
在脚本开始时,可以使用比较运算符来验证用户输入或命令行参数是否符合预期。
#!/bin/bashif [ "$#" -ne 2 ]; thenecho "用法: $0 <数字1> <数字2>"exit 1
finum1=$1
num2=$2if ! [[ "$num1" =~ ^[0-9]+$ ]] || ! [[ "$num2" =~ ^[0-9]+$ ]]; thenecho "错误: 请输入两个整数"exit 1
fi
2. 条件执行
根据不同的条件执行不同的命令或代码块。
#!/bin/bashnum=10if [ $num -lt 5 ]; thenecho "数字小于5"
elif [ $num -ge 5 ] && [ $num -le 10 ]; thenecho "数字在5到10之间"
elseecho "数字大于10"
fi
3. 循环控制
在循环结构中,可以使用比较运算符来控制循环的执行次数或条件。
#!/bin/bashfor ((i=0; i<10; i++)); doecho "当前数字: $i"
donecount=0
while [ $count -lt 5 ]; doecho "计数器: $count"count=$((count + 1))
done
4. 文件操作
在进行文件操作时,可以使用比较运算符来检查文件的存在性、权限等属性。
#!/bin/bashfile="example.txt"if [ -e "$file" ]; thenecho "文件存在"
elseecho "文件不存在"
fiif [ -r "$file" ]; thenecho "文件可读"
elseecho "文件不可读"
fi
5. 数组操作
在处理数组时,可以使用比较运算符来检查数组的长度、元素等。
#!/bin/basharr=("apple" "banana" "cherry")if [ ${#arr[@]} -eq 3 ]; thenecho "数组长度为3"
elseecho "数组长度不为3"
fiif [ "${arr[0]}" = "apple" ]; thenecho "数组第一个元素为apple"
elseecho "数组第一个元素不为apple"
fi
6. 逻辑运算
结合逻辑运算符(&& 和 ||),可以实现更复杂的条件判断。
#!/bin/bashnum=10if [ $num -gt 5 ] && [ $num -lt 15 ]; thenecho "数字在5到15之间"
elif [ $num -le 5 ] || [ $num -ge 15 ]; thenecho "数字不在5到15之间"
fi
7. 脚本错误处理
在脚本中添加错误处理逻辑,以确保在遇到问题时能够及时退出并给出提示。
#!/bin/bashcommand_output=$(some_command)if [ $? -ne 0 ]; thenecho "执行some_command时出错"exit 1
fi
这些仅仅是Shell脚本中使用比较运算符的一些常见场景,实际上,比较运算符可以应用于任何需要条件判断和逻辑控制的场景。
脚本与用户交互
1. 使用 read 命令
read 命令可以从标准输入读取一行数据,并将其存储到变量中。
#!/bin/bashecho "请输入你的名字:"
read name
echo "你好,$name!"
2. 使用 select 命令
select 命令可以创建一个菜单供用户选择。
#!/bin/bashecho "请选择一个选项:"
select option in "选项1" "选项2" "选项3"; docase $option in"选项1")echo "你选择了选项1";;"选项2")echo "你选择了选项2";;"选项3")echo "你选择了选项3";;*)echo "无效的选择";;esacbreak
done
3. 使用 dialog 工具
dialog 是一个用于创建图形化界面的工具,可以在终端中显示对话框。
首先,确保你已经安装了 dialog 工具:
sudo apt-get install dialog # 在Debian/Ubuntu系统上
然后,你可以使用 dialog 创建一个简单的对话框:
#!/bin/bashdialog --title "选择操作" --menu "请选择一个操作:" 10 30 3 1 "选项1" 2 "选项2" 3 "选项3" 2> /tmp/menu.resultchoice=$(cat /tmp/menu.result)case $choice in1)echo "你选择了选项1";;2)echo "你选择了选项2";;3)echo "你选择了选项3";;*)echo "无效的选择";;
esac
4. 使用 whiptail 工具
whiptail 是另一个用于创建图形化界面的工具,类似于 dialog。
首先,确保你已经安装了 whiptail 工具:
sudo apt-get install whiptail # 在Debian/Ubuntu系统上
然后,你可以使用 whiptail 创建一个简单的菜单:
#!/bin/bashchoice=$(whiptail --title "选择操作" --menu "请选择一个操作:" 10 30 3 1 "选项1" 2 "选项2" 3 "选项3" 3>&1 1>&2 2>&3)case $choice in1)echo "你选择了选项1";;2)echo "你选择了选项2";;3)echo "你选择了选项3";;*)echo "无效的选择";;
esac
5. 使用 expect 工具
expect 是一个用于自动化交互式应用程序的工具,通常用于自动化SSH登录等操作。
首先,确保你已经安装了 expect 工具:
sudo apt-get install expect # 在Debian/Ubuntu系统上
然后,你可以使用 expect 自动化交互过程:
#!/usr/bin/expect -fspawn ssh user@hostname
expect "password:"
send "your_password\r"
expect "$ "
send "your_command\r"
expect "$ "
send "exit\r"
expect eof
这些方法可以帮助你在Shell脚本中实现与用户的交互。选择哪种方法取决于你的具体需求和环境。
检测用户输入
在Shell脚本中检测用户输入可以通过条件语句和比较运算符来实现。以下是一些常见的方法:
1. 使用 if 语句和比较运算符
你可以使用 if 语句和比较运算符(如 -eq, -ne, -lt, -le, -gt, -ge)来检测用户输入的数值。
#!/bin/bashecho "请输入一个整数:"
read numberif [ $number -eq 0 ]; thenecho "你输入的是0"
elif [ $number -gt 0 ]; thenecho "你输入的是正数"
elseecho "你输入的是负数"
fi
2. 使用 case 语句
case 语句可以用于检测用户输入的字符串。
#!/bin/bashecho "请输入一个选项(A/B/C):"
read optioncase $option inA)echo "你选择了A";;B)echo "你选择了B";;C)echo "你选择了C";;*)echo "无效的选择";;
esac
3. 使用正则表达式
你可以使用正则表达式来检测用户输入的格式。
#!/bin/bashecho "请输入一个邮箱地址:"
read emailif [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; thenecho "有效的邮箱地址"
elseecho "无效的邮箱地址"
fi
4. 使用 grep 命令
你还可以使用 grep 命令来检测用户输入是否匹配某个模式。
#!/bin/bashecho "请输入一个URL:"
read urlif echo "$url" | grep -qE '^(https?|ftp)://[^"]+$'; thenecho "有效的URL"
elseecho "无效的URL"
fi
5. 使用 getopts 命令
getopts 是一个用于解析命令行选项的Shell内置命令。
#!/bin/bashwhile getopts ":a:b:" opt; docase $opt ina)echo "选项a被设置,值为:$OPTARG";;b)echo "选项b被设置,值为:$OPTARG";;\?)echo "无效的选项:$OPTARG" >&2;;:)echo "选项 -$OPTARG 需要一个参数。" >&2;;esac
doneshift $((OPTIND-1))echo "剩余的参数:$@"
这些方法可以帮助你在Shell脚本中检测用户输入,并根据输入执行相应的操作。选择哪种方法取决于你的具体需求和环境。
编写交互式shell脚本
编写一个交互式Shell脚本通常涉及接收用户输入并根据输入执行相应的操作。以下是一个简单的示例,展示了如何编写一个交互式Shell脚本:
示例:简单的交互式Shell脚本
#!/bin/bash# 提示用户输入名字
echo "请输入你的名字:"# 使用read命令读取用户输入并存储在变量name中
read name# 输出问候语
echo "你好,$name!"# 提示用户输入年龄
echo "请输入你的年龄:"# 使用read命令读取用户输入并存储在变量age中
read age# 输出年龄信息
echo "你的年龄是:$age岁"# 提示用户选择操作
echo "请选择一个操作:"
echo "1. 显示当前日期"
echo "2. 显示当前时间"
echo "3. 退出"# 使用read命令读取用户选择并存储在变量choice中
read choice# 根据用户选择执行相应的操作
case $choice in1)echo "当前日期是:$(date +%Y-%m-%d)";;2)echo "当前时间是:$(date +%H:%M:%S)";;3)echo "退出程序"exit 0;;*)echo "无效的选择";;
esac
解释
-
Shebang (
#!/bin/bash):-
这行告诉系统使用
/bin/bash解释器来执行这个脚本。
-
-
提示用户输入名字:
-
echo "请输入你的名字:"输出提示信息。
-
-
读取用户输入:
-
read name读取用户输入的名字并存储在变量name中。
-
-
输出问候语:
-
echo "你好,$name!"使用变量name输出问候语。
-
-
提示用户输入年龄:
-
echo "请输入你的年龄:"输出提示信息。
-
-
读取用户输入:
-
read age读取用户输入的年龄并存储在变量age中。
-
-
输出年龄信息:
-
echo "你的年龄是:$age岁"使用变量age输出年龄信息。
-
-
提示用户选择操作:
-
echo "请选择一个操作:"和后续的echo命令输出操作选项。
-
-
读取用户选择:
-
read choice读取用户选择的操作并存储在变量choice中。
-
-
根据用户选择执行相应的操作:
-
case $choice in ... esac结构根据用户的选择执行相应的操作。
-
运行脚本
-
将上述脚本保存到一个文件中,例如
interactive_script.sh。 - 赋予脚本执行权限:
chmod +x interactive_script.sh - 运行脚本:
./interactive_script.sh
这样,你就可以看到一个简单的交互式Shell脚本,它会提示用户输入名字和年龄,并根据用户的选择显示当前日期或时间。
相关文章:
shell脚本(4)一文解决比较运算符用户交互
免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 比较运算符 在Shell脚本中…...
windows 操作系统下载 Android源码教程
前言 开始我是装了hyber-v 虚拟机ubuntu 的,然而非常的卡顿且难用。因此我尝试在windows上使用repo,因此有了这篇文章 补充 第二天发现编译源码也需要linux命令因为源码中的很多脚本都是.sh的 因此最终通过安装WSL解决(在window应用商店就…...
【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 💯前言💯提示词英文模板💯提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…...
vue3-input 搜索框
第一种 实现效果 实现代码 <template><div class="input-box mb20"><input type="text" class="input" /><span class="span">搜</span></div> </template><script setup> import …...
记录eslint报错的情况
这几天在调试vue的eslint,害,我领导说eslint要打开规范代码,顺带看了一下eslint的规则,并且研究一下报错。切记每次修改了.eslintrc配置文件,需要重启项目再查看控制台,否则之前的报错会一直存在。 第一个…...
mongodb多表查询,五个表查询
需求是这样的,而数据是从mysql导入进来的,由于mysql不支持数组类型的数据,所以有很多关联表。药剂里找药物,需要药剂与药物的关联表,然后再找药物表。从药物表里再找药物与成分关联表,最后再找成分表。 这里…...
Git Bash + VS Code + Windows11 Git命令报错莫名奇妙的问题
环境: git version 2.47.0.windows.1 gitbash版本:Git-2.47.0-64-bit windows版本: Windows 11 专业版 版本号 23H2 安装日期 2024/11/16 操作系统版本 22631.4460 体验 Windows Feature Experience Pack 1000.22700.10…...
湛江市社保卡申领指南:手机获取电子照片回执单号
在湛江市,社保卡的申领流程已经实现了数字化,为市民带来了极大的便利。特别是通过手机获取数码照片回执单号,这一环节更是简化了申领过程。今天,我们将详细介绍如何不去照相馆,利用手机来获取数码照片回执单号…...
Linux离线安装Docker命令,简单镜像操作
解压安装包 首先,使用 tar 命令解压 docker-27.3.1.tgz 安装包: tar -zxvf docker-27.3.1.tgz 将二进制文件移动到可执行路径上的目录 接着,将解压出来的 Docker 二进制文件复制到系统的可执行路径(通常是 /usr/bin/)…...
【Node.js】Node.js 和浏览器之间的差异
Node.js 是一个强大的运行时环境,它在现代 JavaScript 开发中扮演着重要角色。然而,许多开发者在使用 Node.js 时常常会感到困惑,尤其是与浏览器环境的对比。本文将深入探讨 Node.js 和浏览器之间的差异,帮助你全面理解两者的设计…...
基于MySQL的 CMS(内容管理系统)的表结构设计
目录 1. 用户管理 (Users) 2. 内容管理 (Content/Posts) 3. 分类 (Categories) 4. 标签 (Tags) 5. 内容与分类关系 (Content_Category) 6. 内容与标签关系 (Content_Tag) 7. 媒体库 (Media) 8. 设置 (Settings) 9. 评论 (Comments) 10. 活动日志 (Activity_Log) 11. …...
2.13 转换矩阵
转换矩阵引用了库nalgebra,使用时研究具体实现。 use std::ops;use nalgebra::Perspective3;use crate::Scalar;use super::{Aabb, LineSegment, Point, Triangle, Vector};/// An affine transform #[repr(C)] #[derive(Debug, Clone, Copy, Default)] pub struct…...
【C语言】遗传算法matlab程序
遗传算法matlab程序 遗传算法是一种模拟自然选择过程的优化技术,用于解决复杂问题。在MATLAB中编写遗传算法程序,通常包括以下几个步骤: 初始化种群:创建一个初始解集(种群),每个解代表一个问题…...
Java LinkedList 详解
LinkedList 是 Java 集合框架中常用的数据结构之一,位于 java.util 包中。它实现了 List、Deque 和 Queue 接口,是一个双向链表结构,适合频繁的插入和删除操作。 1. LinkedList 的特点 数据结构:基于双向链表实现,每个…...
mac-mini的时间机器,数据备份到alist 中的网盘
苹果的时间机器不能直接将备份存储在 alist 上的网盘,但可以通过一些中间步骤来实现类似的效果,以下是具体介绍: 方法原理 通过将支持 WebDAV 协议的网络存储挂载到本地,再将其设置为时间机器的备份磁盘,从而间接实现…...
【HarmonyOS】鸿蒙应用加载读取csv文件
【HarmonyOS】鸿蒙应用加载读取csv文件 一、问题背景: 1. csv文件是什么? csv是一种文本文件格式,与json类似。会存储一些文本内容,应用需要读取该文件,进行UI内容得填充等。 文件中的数据是以纯文本形式存储的&…...
Java retainAll() 详解
在 Java 中,retainAll() 是 Collection 接口(List、Set 等集合类实现该接口)的一种方法,用于保留集合中与指定集合交集的元素,删除其他所有元素。 以下是对 retainAll() 方法的详细讲解。 1. 方法定义 方法签名 boo…...
Redis的基本数据类型
初识Redis缓存 Redis缓存: 实际开发中经常使用Redis作为缓存数据库,从而提高数据存取效率,减轻后端数据库的压力。 可以将经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到MyS…...
通过vite+vue3+pinia从0到1搭建一个uniapp应用
最近项目上要做一个app,选择了用uniapp作为开发框架;我大概看了一下uniapp的文档,根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器,但是uniapp官方推荐使用HBuilder搭建,如果和我一样…...
Linux的桌面
Linux的桌面是可以卸载的 的确,Linux并不像Windows,Linux本身是一个基于命令行的操作系统,在内核眼中,桌面只不过是个普通的应用程序,所以,在Linux的桌面中可以完成的事情,命令行中也基本可以完…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
