sh脚本笔记2
test条件测试
语法
条件测试语法 | 说明 |
---|---|
语法1:test <测试表达式> | 这是利用test命令进行条件测试表达式的方法。test命令和“<测试表达式>”之间至少有一个空格 |
语法2:[ <测试表达式> ] | 这是通过[](单中括号)进行条件测试表达式的方法,和test命令的用法相同,这是老男孩推荐的方法。[]的边界和内容之间至少有一个空格 |
语法3:[[ <测试表达式> ]] | 这是通过[[]](双中括号)进行条件测试表达式的方法,是比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。(支持正则处理) |
语法4:((<测试表达式>)) | 这是通过(())(双小括号)进行条件测试表达式的方法,一般用于if语句里。(())(双小括号)两端不需要有空格 |
参数
1. 关于某个文件名的类型侦测(存在与否),如:test -e filename
-e 该【文件名】是否存在?(常用)(不区分目录和文件)
-f 该【文件名】是否为文件(file)?(常用)
-d 该【文件名】是否为目录(directory)?(常用)
-b 该【文件名】是否为一个block device装置?
-c 该【文件名】是否为一个character device装置?
-S 该【文件名】是否为一个Socket文件?
-p 该【文件名】是否为一个FIFO(pipe)文件?
-L 该【文件名】是否为一个连结档?2.关于文件的权限侦测,如:test -r filename
-r 侦测该文件名是否具有【可读】的属性?
-w 侦测该文件名是否具有【可写】的属性?
-x 侦测该文件名是否具有【可执行】的属性?
-u 侦测该文件名是否具有【SUID】的属性?
-g 侦测该文件名是否具有【SGID】的属性?
-k 侦测该文件名是否具有【Sticky bit】的属性?
-s 侦测该文件名是否具有【非空白文件】?3.两个文件之间的比较,如:test file1 -nt file2
-nt (newer than)判断file1是否比file2新
-ot (older than)判断file1是否比file2旧
-ef 判断file1与file2是否为同一文件,可用在判断hand link的判定上。主要意义在判定,两个文件是否均指向同一个inode哩!4.关于两个整数之间的判定,例如:test n1 -eq n2
-eq 两数值相等(equal)
-ne 两数值不等(not equal)
-gt n1大于n2(greater than)
-lt n1小于n2(less than)
-ge n1大于等于n2(greater than or equal)
-le n1小于等于n2(less than or equal)5.判定字符串的数据
test -z string 判定字符串是否为0?若string为空字符串,则为true
test -n string 判定字符串是否非为0?若string为空字符串,则为false
注:-n 亦可省略
test str1 = str2 判定str1是否等于str2,若相等,则回传true
test str1 != str2 判定str1是否不等于str2,若相等,则回传false6.多重条件判定,例如:test -r filename -a -x filename
-a (and)两状况同时成立!例如:test -r file -a -x file,则file同时具有r与x权限时,才回传true
-o (or)两状况任何一个成立!例如:test -r file -o -x file,则file具有r或x权限时,就可回传true
! 反相状态,如test ! -x file,当file不具有x时,回传true
注意:
在条件测试中使用变量,必须添加双引号
字符串比较
常用字符串测试操作符 | 说明 |
---|---|
-n “字符串” | 若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero |
-z “字符串” | 若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写 |
“串1” = “串2” | 若字符串1等于字符串2,则为真,即测试表达式成立,可使用"==“代替”=",=号两边有空格 |
“串1” != “串2” | 若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!==“代替”!=" ,!=号两边有空格 |
注意:
对于字符串变量的比较,一定要记住给变量添加双引号。使用等于号的值判断,左右两边也必须有空格
数值比较
在[]以及test中使用的比较符号(使用右边的需要转义) | 在(())和[[]]中使用的比较符号(左边的也可以用) | 说明 |
---|---|---|
-eq | ==或= | 相等,全拼为equal |
-ne | != | 不相等,全拼为not equal |
-gt | > | 大于,全拼为greater than |
-ge | >= | 大于等于,全拼为greater equal |
-lt | < | 小于,全拼为less then |
-le | <= | 小于等于,全拼为less equal |
逻辑操作符
在[]以及test中使用的操作符(右边不能使用) | 在(())和[[]]中使用的操作符 | 说明 |
---|---|---|
-a | && | and,与,两端都为真,则结果为真 |
-o | || | or,或,两端有一个为真,则结果为真 |
! | ! | not,非,两端相反,则结果为真 |
测试表达式符号总结
测试表达式符号 | [] | test | [[]] | (()) |
---|---|---|---|---|
边界为是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
逻辑操作符 | ! -a -o | ! -a -o | ! && || | ! && || |
整数比较操作符 | -eq -ne -gt -lt -ge -le | -eq -ne -gt -lt -ge -le | -eq -ne -gt -lt -ge -le或= != > >= < <= | = != > >= < <= |
字符串比较操作符 | = == != | = == != | = == != | = == != |
是否支持通配符匹配 | 不支持 | 不支持 | 支持 | 不支持 |
注意:
最常用的就是,中括号,搭配-gt -lt
如此用法即可
if
单if
if <条件表达式>
then代码。。。
fi
或
if <条件表达式>;then代码。。。
fi
if-else
if <条件表达式>
then代码。。。
else代码。。。
fi
或
if <条件表达式>;then代码。。。
else代码。。。
fi
if-elseif
if <条件表达式>
then代码。。。
elif <条件表达式>
then代码。。。
else代码。。。
fi
或
if <条件表达式>;then代码。。。
elif <条件表达式>;then代码。。。
else代码。。。
fi
开发MySQL监控脚本
端口监控 | 1)在服务器本地监控服务端口的常见命令有netstat、ss、lsof 2)从远端监控服务器本地端口的命令有telnet、nmap、nc |
---|---|
监控服务进程或进程数 | 此方法适合本地服务器,注意,过滤的是进程的名字。命令为: ps -ef | grep nginx | wc -l ps -ef | grep mysql | wc -l |
在客户端模拟用户访问 | 使用wget或curl命令进行测试(如果检测数据库,则需要转为通过Web服务器去访问数据库),并对测试结果做三种判断: 1)利用返回值(echo $?)进行判断 2)获取特殊字符串以进行判断(需要事先开发好程序) 3)根据HTTP响应header的情况进行判断 |
登录MySQL数据库判断 | 通过MySQL客户端连接数据库,根据返回值或返回内容判断。例如: mysql -uroot -poldboy123 -e “select version();” &>/dev/null;echo $? |
shell函数
函数定义
# 标准函数定义
function 函数名(){函数体# return可写可不写return 返回值
}
# 偷懒写法
# 当使用function关键字时,可以省略括号
function 函数名{函数体# return可写可不写return 返回值
}
# 超级懒人写法
# 必须有括号
函数名(){函数体# return可写可不写return 返回值
}
函数执行
有关函数执行的基础概念
- 执行shell函数,直接写函数名字即可,无需添加其他内容
- 函数体内定义的变量,称之为局部变量
- 函数体内需要添加return语句,作用是退出函数,且赋予返回值给调用该函数的程序,也就是shell脚本
- return语句和exit不同
- return是结束函数的执行,返回一个(退出值、返回值)
- exit是结束shell环境,返回一个(退出值、返回值)给当前的shell
- 函数如果单独写入一个文件里,需要用source读取(调用函数的脚本如果用source执行,该函数会添加在环境变量里。如果用bash执行,会在子shell中执行,在当前shell中该函数就不会添加在环境变量里)
- 函数内,使用local关键字,定义局部变量
- 函数名字后面都不需要带括号
- 和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
- Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。
函数参数
函数体内可以使用参数变量,获取函数参数。函数的参数变量,与脚本参数变量是一致的。
- $1~$9:函数的第1个到第9个的参数。
- $0:函数所在的脚本名,以及脚本路径。
- $#:函数的参数总数。
- $@:函数的全部参数,参数之间使用空格分隔。
- $*:函数的全部参数,参数之间使用变量$IFS值的第一个字符分隔,默认为空格,但是可以自定义。
如果函数的参数多于9个,那么第10个参数可以用${10}的形式引用,以此类推。
相关文章:
sh脚本笔记2
test条件测试 语法 条件测试语法说明语法1:test <测试表达式>这是利用test命令进行条件测试表达式的方法。test命令和“<测试表达式>”之间至少有一个空格语法2:[ <测试表达式> ]这是通过[](单中括号)进行条件…...

js替换对象里面的对象名称
data为数组,val为修改前的名称,name为修改后的名称 JSON.parse(JSON.stringify(data).replace(/val/g, name)) ; 1.替换data里面的对象tenantInfoRespVO名称替换成tenantInfoUpdateReqVO 2.替换语句: 代码可复制 let tenantInf…...

鸿蒙开发设备管理:【@ohos.settings (设置数据项名称)】
设置数据项名称 说明: 本模块首批接口从API version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块提供设置数据项的访问功能相关接口的说明及示例。 导入模块 import settings from ohos.settings;settings.getUri…...

STM32之五:TIM定时器(2-通用定时器)
目录 通用定时器(TIM2~5)框图 1、 输入时钟源选择 2、 时基单元 3 、输入捕获:(IC—Input Capture) 3.1 输入捕获通道框图(TI1为例) 3.1.1 滤波器: 3.1.2 边沿检测器…...

【分布式系统】监控平台Zabbix对接grafana
以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 一.安装grafana并启动 添加一台服务器192.168.80.104 初始化操作 systemctl disable --now firewalld set…...

操作系统真象还原:编写硬盘驱动程序
第13章-编写硬盘驱动程序 这是一个网站有所有小节的代码实现,同时也包含了Bochs等文件 13.1 硬盘及分区表 13.1.1 创建从盘及获取安装的磁盘数 要实现文件系统,必须先有个磁盘介质,虽然咱们己经有个虚拟磁盘 hd60M.img,但它只…...
firewalld防火墙(二)
一:firewalld高级配置 1:关于iptables的知识 iptables 是Linux系统中传统的命令行防火墙管理工具,它基于内核的netfilter框架工作,用于配置和管理网络规则集,比如过滤(允许/拒绝)进出的数据包…...
Android-悬浮窗口
在Android系统中,如果应用需要弹出一个悬浮窗口,就需要申请一项特殊权限 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW"/>在Android O之前的系统中申请了该权限后,再给对应的window设置 WindowM…...
打破僵局:Foxit Reader无法打开的终极解决方案
打破僵局:Foxit Reader无法打开的终极解决方案 在数字化阅读时代,Foxit Reader作为一款广受欢迎的PDF阅读器,其打不开的问题无疑会给用户带来诸多不便。本文将为您提供全面的解决方案,从基础检查到高级技巧,确保您能够…...

[调试] JTAG下运行正常,从QSPI或者SD卡启动则无响应,如何查找问题
[调试] JTAG下运行正常,从QSPI或者SD卡启动则无响应,如何查找问题 一、问题现象二、用自定义fsbl替代系统默认的fsbl1. 新建fsbl_new2. 如果提示缺少xilffs库3. 使能调试信息输出 三. 启动成功和失败情况下的典型输出1. JTAG启动模式: 正常加载2. QSPI启…...
Linux内核 -- 多线程之wait_event用法
Linux Kernel 中 wait_event 的高级用法及注意事项 在Linux内核编程中,wait_event 系列函数是用于实现进程等待和事件通知机制的重要工具。本文将详细介绍 wait_event 的高级用法以及注意事项。 1. 基本用法 wait_event 系列宏主要包括以下几种形式: …...

双指针系列第 8 篇:盛水最多的容器。几句话讲明白!
Leetcode 题目链接 思路 取首尾双指针和水量如下所示,设高度函数为 h ( i ) h(i) h(i),在下图中 h ( l ) < h ( r ) h(l) < h(r) h(l)<h(r)。 观察以 l l l 为左边界所能构成的其他水量,与矮的右边界搭配结果如下。 与高的…...
c++高阶-1-模板
文章目录 模板一、模板基本语法二、函数模板1.基本语法2.函数模板注意事项3.普通函数和函数模板区别4.普通函数和函数模板调用规则 三、类模板1.基本语法2.类模板和函数模板的区别3.类模板中成员函数调用时机4.类模板对象做函数参数5.类模板与继承6.成员函数的类外实现 模板 一…...

.net core 的 winform 的 浏览器控件 WebView2
在.NET Core WinForms应用程序中,没有直接的“浏览器控件”,因为WinForms不支持像WebBrowser控件那样的功能。但是,你可以使用WebView2控件,它是一个基于Chromium的浏览器内核,可以在WinForms应用程序中嵌入Web内容。 …...

Django QuerySet对象,all()方法
all()方法 在Django中,all()方法是QuerySet对象的一个方法,用于获取模型的所有实例。 当你调用ModelName.objects.all()时,Django会生成一个SQL查询,从数据库中获取该模型的所有记录,并返回一个QuerySet对象…...
自动生成网站sitemap
要在 Next.js 和 Contentlayer 项目中实现自动生成 Sitemap 的功能,你可以编写一个脚本,在每次生成文档后自动生成 Sitemap。以下是一个示例脚本,你可以根据自己的需求进行调整。 步骤 1:安装必要的依赖 首先,你需要…...

中国经济昆虫志(55卷)
中国经济昆虫志,共55卷,内容包括概述、形态特征、分类等。各级分类单元均编有检索表,每个种有特征描述、地理分布,有的还记载有生活习性和防治方法。为便于鉴定,绘制有特征图和彩色图。 包括鞘翅目天牛科、半翅目蝽科、…...
linux环境安装elasticsearch缓存数据库和Kibana客户端
linux环境安装elasticsearch缓存数据库,今天我们安装7.17.18版本,并分析遇到的问题。 一、elasticsearch安装运行 1、直接下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解压 tar -…...

OpenSSL的一些使用案例
目录 一、介绍 二、基本使用 1、Shell (1)文件加解密 (2)生成密钥文件 2、API (1)md5sum (2)AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法,只…...

常用字符串方法<python>
导言 在python中内置了许多的字符串方法,使用字符串方法可以方便快捷解决很多问题,所以本文将要介绍一些常用的字符串方法。 目录 导言 string.center(width[,fillchar]) string.capitalize() string.count(sub[,start[,end]]) string.join(iterabl…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...