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(索引名称); 清理碎片方…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
