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(索引名称); 清理碎片方…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
