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…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
