shell脚本【一、 特殊变量/子串/特殊扩展变量/父子shell/内置命令、外置命令】
特殊变量
位置参数的获取
- $0 获取shell脚本文件名,以及脚本路径;
- $n 获取shell脚本的第n个参数,n在1~9之间,如$1$2$9,大于9则需要写 ${10};
- $# 获取执行的shell脚本后面的参数总个数;
- $* 获取shell脚本所有参数,不加引用等同于¥@作用,加上引号"$@" 作用是 接收所有参数为单个字符串;
- $@ 不加引号,效果同上,加引号,是接收所有参数为独立字符串,如"$1" “$2” “$3” …,空格保留
特殊状态变量
- $? 上一次命令执行状态返回值,0正确,非0失败
- $$ 当前shell脚本的进程号
- $! 上一次后台进程的PID
- $_ 取得上次执行命令的最后一个参数
查找方式 man bash
搜索Special Parameters
# $# 获取参数个数 -ne不等于
[ $# -ne 2] && {echo "must be two args"exit 119 # 终止程序运行,且返回119状态码,提供给当前shell的#?变量,若是在函数里 可以return 119 用法
}
echo ok
怎么让程序后台执行?
nohup xxx & 1> /dev/null
shell子串
bash一些基础的内置命令
echo
eval
exec
export
read
shift
echo命令
-n 不换行输出
-e 解析字符串中的特殊符号\n 换行
\r 回车
\t 制表位 四个空格
\b 退格
echo
# 默认换行
echo 你好;echo 你坏
你好
你坏# 不换行打印
echo -n 你好;echo -n 你坏
你好你坏# -e
echo -e "我喜欢\n你"
我喜欢
你# 打印命令
printf "你好\t我是\t老猫\n"
你好 我是 老猫
eval
执行多个命令
eval ls;cd /tmp
# 先执行ls
# 后执行cd /tmp
exec
不创建子进程,执行后续命令,且执行完毕后,自动exit
shell子串的花式用法
name="laomao"
${变量} 返回变量值
${name} laomao
${#变量} 返回变量长度,字符长度-------------很重要
${#name} 6
${变量:start} 返回变量offset数值之后的字符
${name:4} ao
${变量:start:length} 提取start之后的字符,且包含start的数字
${name:4:1} a
${变量#word} 从变量开头,删除最短匹配的word子串
${name#lao} mao
${变量##word} 从变量开头,删除最长匹配的word
${name##laom} ao
${变量%word} 从变量结尾删除最短的word
${name%ao} laom
${变量%%word} 从变量结尾开始删除最长匹配的word
${name%%}
${变量/pattern/string} 用string代替第一个匹配的pattern
${变量//pattern/string} 用string代替所有的pattern
计算变量长度的各种玩法
- 多种统计长度的命令
- 统计命令执行速度
# 使用wc命令参数用法
## 输出行数
echo $name | wc -l
cat test.txt | wc -l
## 找出最长的一行,并输出它的长度
echo $name |wc -L
cat test.txt | wc -L# 利用数值计算expr命令
expr length "${name}"# awk统计长度,length函数
echo "${name}" | awk '{print length($0)}'# 最快的统计方法
echo ${#name}
字符串长度统计方法这么多,谁最快?
time命令,统计命令执行市场
for循环的shell编程知识
语法
for number in {1..100}
doecho $number
done
#写在一行的方法
for num in {1..100};do echo $num;done
统计执行时长
#seq生成序列的命令
seq 10 # 默认使用回车分隔
seq -s ":" 10 # 使用:分隔
# 输出结果:
1:2:3:4:5:6:7:8:9:10for n in {1..3};do str1=``seq -s ":" 10`;echo $str1;done
# 结合time命令
time for n in {1..10000};do char=`seq -s "laomao" 100`;echo ${#char} &>/dev/null;done
# 输出结果
real 0m7.884s # 实际运行的时间
user 0m2.211s # 用户态执行的时间
sys 0m5.933s # 内核态执行的时间time for n in {1..10000};do char=`seq -s "laomao" 100`;echo ${char}|wc -L &>/dev/null;done
real 0m8.537s
user 0m2.795s
sys 0m6.002stime for n in {1..10000};do char=`seq -s "laomao" 100`;expr length "${char}" &>/dev/null;done
real 0m14.139s
user 0m3.325s
sys 0m11.623stime for n in {1..10000};do char=`seq -s "laomao" 100`;echo ${char}|awk '{print length($0)}' &>/dev/null;done
real 0m8.666s
user 0m3.270s
sys 0m6.057s
shell编程,尽量使用linux内置的命令,内置的操作,和内置的函数,效率最高C语言开发,效率最高,尽可能减少管道符的操作
字符串截取
# 从开头删除匹配最短
## 从开头删除匹配最长
% 从结尾删除匹配最短
%% 从结尾删除匹配最长# 指定字符内容截取
a*c 匹配开头为a,中间任意个字符,结尾为c的字符串
a*C 匹配开头为a,中间任意个字符,结尾为C的字符串# 替换
echo ${str1/man/boy} # 把man改成boy
echo ${str1//man/boy} # 把所有man改成boy
# 不会修改原有字符串
批量删除文件名后缀
- 单个文件去掉字符
mv laomao_1_finished.jpg laomao_1.png
- 利用变量的子串功能,去掉字符信息
f=laomao_1_finished.jpg;echo ${f//_finished/}
- 利用反引号
mv $f `echo ${f//_finished/}`
- 批量替换文件名,只修改所有的jpg文件
for file_name in `ls *fin*jpg`;do mv $file_name `echo ${file_name//_finished/}` ;done
特殊shell扩展变量(只对变量值为空时起作用,有值直接赋值)
这四个扩展变量,都属于对变量的值进行判断、处理
变量的处理
如果parameter变量值为空,返回word字符串,赋值给result变量
result=${parameter:-word}如果para变量为空,则word替代变量值,且返回其值
result=${parameter:=word}如果para变量为空,word当作stderr输出,否则输出变量值
用于设置变量为空导致错误时,返回的错误信息
result=${parameter:?word}如果para变量为空,什么都不做,否则word返回
result=${parameter:+word}
案例
:-
echo $laomao
result=${laomao:-miaomiao}
echo $laomao # laomao为空 miaomiao
echo $laomao # laomao有值,laomao的值直接赋值给result
:=
echo $laomao
result=${laomao:=miaomiao}
echo $laomao # miaomiao
echo $result # miaomiao
:=
echo $laomao
result=${laomao:=miaomiao}
echo $laomao # miaomiao
echo $result # miaomiao
:?
echo $laomao
echo ${laomao:?该变量值为空} # 有值输出值,无值输出 该变量值为空
:+
echo ${laoamo:+miaomiao} # 无值什么都不做,有值输出miaomiao
实际应用
数据备份,删除过期数据的脚本
find xargs 搜索且删除
# 删除7天以上的过期数据
find 需要搜索的目录 -name 你要搜索的文件名字 -type 文件类型 -mtime +7|xargs rm -fcat del_data.sh# 没有判断路径是否为空
find ${path} -name '*.tar.gz' -type f -mtime +7|xargs rm -f
父子shell
- source和点,执行命令,只在当前的shell环境中执行生效;
- 通过bash解释器执行脚本,是开启subshell,开启子shell运行脚本命令;
- ./script,都会指定shebang,通过解释器运行,也是开启subshell运行命令。
父shell
pstree看到的结果就是父shell环境;
pstree
├─sshd───sshd───sshd───bash───bash───pstree
ps进程管理命令,查看
ps -ef
-f 显示UID,PID,PPID【PID 进程号 PPID子进程号】
-e 列出所有进程的信息,如同-A选项optionps -ef --forest
创建进程列表(创建子shell执行命令)
需要执行一系列的shell命令
ls ;cd ;pwd; echo "laomao"
列表,是被包括起来的数据
shell的进程列表理念,需要使用 () 小括号如下执行方式,就称为进程列表
(cd ~;pwd;ls;cd /tmp/;pwd;ls)
检测是否在子shell环境中
linux默认的有关shell的变量该变量的值特点,如果是0,就是在当前shell环境中执行的,否则就是开辟子shell去运行的
BASH_SUBSHELL
- 未开启子shell运行的命令
cd ; ls ;pwd; echo $BASH_SUBSHELL
# 返回0,没有使用子shell
- 开启子shell运行的命令
(cd;ls;pwd;echo $BASH_SUBSHELL)
# 返回1,在子shell中运行
子shell嵌套运行
一个小括号,开启一个子shell运行命令,还可以嵌套多个
(pwd;(pwd;(echo $BASH_SUBSHELL)))
# 返回3
利用括号,开启子shell的理念,以及检查,在shell脚本开发中经常会用子shell进行多进程的处理,提高程序并发执行效率。
内置命令、外置命令
shell
linux指令
内置命令:在系统启动时就加载入内存,常驻内存,执行效率更高,但是占用资源,cd
外置命令:用户需要从硬盘中读取程序文件,再读入内存加载
外置命令
也称之为,自己单独下载的文件系统命令,处于bash shell之外的程序。
/bin
/usr/bin
/sbin
/usr/sbin
通过linux的type命令,验证是否是内置外置命令
- 外置命令一定会开启子进程执行
ps -f --forest
内置命令
- 内置命令不会产生子进程去执行;
- 内置命令和shell是为一体的,是shell的一部分,不需要单独去读取某个文件,系统启动后,就执行在内存中了。
查看linux系统中的内置命令:compgen -b
相关文章:
shell脚本【一、 特殊变量/子串/特殊扩展变量/父子shell/内置命令、外置命令】
特殊变量 位置参数的获取 $0 获取shell脚本文件名,以及脚本路径;$n 获取shell脚本的第n个参数,n在1~9之间,如$1$2$9,大于9则需要写 ${10};$# 获取执行的shell脚本后面的参数总个数;$* 获取she…...

服务器禁用远程(22)
vim /etc/ssh/sshd_config 修改 ListenAddress 0.0.0.0 为ListenAddress localhost 修改完后 重启一下sshd systemctl restart sshd 修改就生效了...
Docker 进阶构建:镜像、网络与仓库管理
目录 三. docker镜像构建 1. docker镜像结构 2. 镜像运行的基本原理 3. 镜像获得方式 4. 镜像构建 5. Dockerfile实例 6. 镜像优化方案 6.1. 镜像优化策略 6.2. 镜像优化示例:缩减镜像层 6.3. 镜像优化示例:多阶段构建 6.4. 镜像优化示例:使用最精简镜像 四. docke…...
opencv学习:图像轮廓识别及代码实现
图像轮廓 1.获取图像轮廓 cv2.findContours() 函数是 OpenCV 库中用于检测图像中轮廓的函数。它可以检测到图像中所有连通区域的边界,并返回这些轮廓的列表。从 OpenCV 3.4 版本开始,这个函数的返回值和参数有所变化,以下是详细的参数说明&…...
存储课程学习笔记2_借助内核插入一个文件系统,用文件夹下测试文件系统(mount文件系统到目录下是入口)
裸盘是如何能达到我们日常操作目录那样,按目录依次访问文件等,实际上就是基于裸盘上,用文件系统进行控制。 0:总结。 0:mount是入口,一个裸盘先赋予文件系统,然后mount后才可以用。 1…...
chunk-vendors.js 文件过大导致页面加载缓慢解决方案
1、路由懒加载 在 Webpack 中,我们可以使用动态 import语法来定义代码分块点 (split point): import(./Foo.vue) // 返回 Promise如果您使用的是 Babel,你将需要添加 syntax-dynamic-import 插件,才能使 Babel 可以正确地解析语…...

【Postgresql】地理空间数据的存储与查询,查询效率优化策略,数据类型与查询速度的影响
注:使用postgresql数据库会用到PostGIS 扩展。 一、安装PostGIS 扩展 在 PostgreSQL 中遇到错误 “type geography does not exist” 通常意味着你的 PostgreSQL 数据库还没有安装 PostGIS 扩展,或者 PostGIS 扩展没有被正确地安装在你的数据库中。geo…...
设计模式应用
单例模式 RunTime类是单例模式的体现,getRunTime()方法会返回一个唯一的实例。确保程序中只有一个唯一的RunTime类对象建造者模式 StringBuilder和StringBuffer是建造者模式的体现工厂模式 Calender类中Calender.getInstance()方法 DriverManager.getConnection()方…...
Android开机启动流程
Android开机启动流程 systemReady启动"added application" frameworks/base/services/java/com/android/server/SystemServer.java mainnew SystemServer().run();startBootstrapServicesmActivityManagerService ActivityManagerService.Lifecycle.startService(…...

数据结构基本知识
一、什么是数据结构 1.1、组织存储数据 ---------》内存(存储) 1.2、研究目的 如何存储数据(变量,数组....)程序数据结构算法 1.3、常见保存数据的方法 数组:保存自己的数据指针:是间接访问已经存在的…...

浙大数据结构:02-线性结构4 Pop Sequence
这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,fr…...
java开发,记录一些注解和架构 pojo、entity、respository
最近接了一个项目,说是项目其实也不算是项目,因为是把这个项目赛到其他项目中的。 熟悉一些这个项目的功能,梳理了一下,在代码开发中主要关心pojo、entity、respository、controller、service。 在这里主要记录前3个的流程与作用…...

MatLab基础学习01
MatLab基础学习01 1.基础入门2.MatLab的数据类型2.1数字2.2字符串2.3矩阵2.4.元胞数组2.5结构体 3.MatLab的矩阵的操作3.1矩阵定义与构造3.2矩阵的下标取值 4.MatLab的逻辑流程4. For循环结构4.2 While循环,当条件成立的时候进行循环4.3 IF end 1.基础入门 matlba必…...

第 5 章多视图几何
本章讲解如何处理多个视图,以及如何利用多个视图的几何关系来恢复照相机位置信息和三维结构。通过在不同视点拍摄的图像,我们可以利用特征匹配来计算出三维场景点以及照相机位置。本章会介绍一些基本的方法,展示一个三维重建的完整例子&#…...

IOS 开发者账号注册流程
注册步骤 准备资料 营业执照 法人信息(电话、身份证信息) 注册邮箱(公司邮箱) 开发者信息(电话、身份证信息、邮箱)1. 注册AppleID 注册地址: https://appleid.apple.com/account 填写表单信…...
netty之NioEventLoop和NioEventLoopGroup
类结构图 NioEventLoopGroup #mermaid-svg-5g1iVjr5oyhqXK92 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5g1iVjr5oyhqXK92 .error-icon{fill:#552222;}#mermaid-svg-5g1iVjr5oyhqXK92 .error-text{fill:#55222…...

睿考网:中级经济师考试题型有哪些?
中级经济师考试时间在每年的11月份,2024年考试时间定于11月16-17日,考试科目为《经济基础知识》与《专业知识与实务》两科。 《专业知识与实务》有10个专业,分别是工商管理、知识产权、农业经济、财政税收、金融、保险、运输经济、人力资源管…...

kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)
背景介绍: Confluence是一个专业的企业知识管理与协同软件。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…...
Vmware ubuntu22.04 虚拟机 连接Windows主机虚拟串口
1. Windows虚拟串口配置 虚拟串口下载:虚拟串口 VSPD 的使用_vspd使用教程-CSDN博客 虚拟串口使用:使用虚拟串口在一台电脑上模拟串口通讯_pc怎么模拟一主多从串口-CSDN博客 2. ubuntu虚拟串口配置 Vmware ubuntu22.04 虚拟机 连接windows主机虚拟串口…...

Postgresql碎片整理
创建pgstattuple 扩展 CREATE EXTENSION pgstattuple 获取表的元组(行)信息,包括空闲空间的比例和行的平均宽度 SELECT * FROM pgstattuple(表名); 查看表和索引大小 SELECT pg_relation_size(表名), pg_relation_size(索引名称); 清理碎片方…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...