使用Shell笔记总结
一、变量
1、定义变量不加$
符号,使用变量要用$
;等号两边不能直接接空格符;通常大写字符为系统默认变量,自行设定变量可以使用小写字符。
2、双引号内的特殊字符如 $
等,可以保有其符号代表的特性,即可以有变量、转移字符;单引号内的特殊字符则只会原样输出。
NAME=yanzu;your_name="wu$NAME";echo $your_name # wuyanzu
NAME=tingfeng;your_name='xie$NAME';echo $your_name # xie$NAME
3、在一串指令的执行中,还需要藉由其他额外的指令所提供的信息时,可以使用反单引号 `指令` 或 $(指令)。
# uname -r 作为系统命令,并执行其内容
version=$(uname -r);echo $version
version=`uname -r`;echo $version
4、欲为扩增变量内容时,则可用 "$变量名称"
或 ${变量}
累加内容。
PATH="$PATH":/home/bin # 字符串就是这样拼接的
PATH=${PATH}:/home/bin
5、若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量。
export PATH
env # 可查看环境变量
6、使用readonly可以将变量定义为只读变量,只读变量就是一个常量。unset 命令可以删除变量,变量被删除后不能再次使用,不能删除只读变量。
name="wuyanzu"
readonly name # 指定name为只读变量
age=13
unset age # 后面不能再使用age
7、预设变量,开始执行Script脚本时就会设定,且不能被修改。
$# #传递到脚本的参数的数量
$* #表示所有位置参数的内容,即以一个字符串显示所有向脚本传递的参数;$* 以"$1 $2 … $n"的形式输出所有参数
$@ #与$*相同,$@以"$1 $2 … $n"的形式输出所有参数
$$ #当前进程的进程号PID
$? #上个执行指令的回传值;用于检查上一条指令执行是否正确(linux执行返回的状态值:0表示没有错误,其他任何值表明有错误)
$! #后台运行的最后一个进程的进程号pid
二、字符串
字符串可以用单引号,也可以用双引号,也可以不用引号。 字符串常用操作:拼接、获取长度、提取/替换子串、查找字符。
#!/bin/bash
your_name="wuyanzu"# 单引号拼接
echo 'hello, '$your_name #hello, wuyanzu
echo 'hello, '${your_name} #hello, wuyanzu# 双引号拼接,除单引号方式外加以下方式
echo "hello, $your_name" #hello, wuyanzu
echo "hello, ${your_name}" #hello, wuyanzu# 获取长度
echo ${#your_name} #7
expr length $your_name# 查找字符位置
expr index $your_name u #查找u第一次出现的位置,没有就是0,输出:2
expr index $your_name yu #查找y和u第一次出现的位置,谁先出现算谁,输出:2# 提取子串
echo ${your_name:2} #从索引2开始,至结尾。输出:yanzu
echo ${your_name:2:3} #从索引2开始,取3个字符。输出:yan
expr substr $your_name 2 3 #从第二个字符开始,取3个。输出:uya# 匹配删除子串
echo ${your_name#"wu"} #从头开始,匹配最短的wu,将其删除后。输出:yanzu
echo ${your_name##"wu"} #从头开始,匹配最长的wu,将其删除后。输出:yanzu
echo ${your_name%"wu"} #从尾开始,匹配最短的yanzu,将其删除后。输出:wu
echo ${your_name%%"wu"} #从头开始,匹配最长的yanzu,将其删除后。输出:wu# 替换子串
echo ${your_name/u/o} #使用u替换从头开始第一个匹配的o,输出:woyanzu
echo ${your_name//u/o} #使用u替换匹配到的所有o,输出:woyanzo
三、数组
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小,数组元素的下标由 0 开始。
Shell 数组用括号来表示,元素用"空格"符号分割开。
#!/bin/bash# 定义一个数组
your_name=(w u yan "zu")your_name[4]="!"# 获取指定元素
echo ${your_name[2]} #获取第2个元素,输出:yan# 获取数组长度
echo ${#your_name[*]} # 5
echo ${#your_name[*]}# 获取所有元素
echo ${your_name[*]} # w u yan zu !
echo ${your_name[@]}# 关联数组
declare -A name=(["my_name"]="wuyanzu" ["your_name"]="pengyuyan")
name["his_name"]="panchangjiang"echo ${name["my_name"]} # wuyanzu
echo ${#name[*]} # 3
echo ${name[*]} # pengyuyan wuyanzu panchangjiang
四、基本运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。有以下两个要注意的点:
- 对于所有的运算符,表达式和运算符之间要有空格,例如
2+2
是不对的,必须写成2 + 2
。 - 条件表达式要放在方括号之间,并且要有空格,例如:
[$a == $b]
是错误的,必须写成[ $a == $b ]
。
4.1 算数、字符串运算符
乘号*
前边必须加反斜杠\
才能实现乘法运算。
# 算数运算符
`expr $a + $b` # a+b
`expr $a - $b` # a-b
`expr $a \* $b` # a*b
`expr $b / $a` # a/b
`expr $b % $a` # a%b
a=$b # 把变量b的值赋给a
[ $a == $b ] # a是否等于b
[ $a != $b ] # a是否等于b# 字符串运算符
[ $a = $b ] #检测两个字符串是否相等,相等返回 true
[ $a != $b ] #检测两个字符串是否不相等,不相等返回 true
[ -z $a ] #检测字符串长度是否为0,为0返回 true
[ -n "$a" ] #检测字符串长度是否不为 0,不为 0 返回 true
[ $a ] #检测字符串是否不为空,不为空返回 true
4.2 关系、布尔、逻辑运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
# 关系运算符
[ $a -eq $b ] # a == b
[ $a -ne $b ] # a != b
[ $a -gt $b ] # a > b
[ $a -lt $b ] # a < b
[ $a -ge $b ] # a >= b
[ $a -le $b ] # a <= b# 布尔运算符
[ $a -lt 20 -a $b -gt 100 ] # -a:与
[ $a -lt 20 -o $b -gt 100 ] # -o:或
[ ! false ] # !:非# 逻辑运算符
[[ $a -lt 100 && $b -gt 100 ]] # 逻辑AND
[[ $a -lt 100 || $b -gt 100 ]] # 逻辑OR
4.3 文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
[ -b $file ] # 检测文件是否是块设备文件,如果是,则返回 true
[ -c $file ] # 检测文件是否是字符设备文件,如果是,则返回 true
[ -d $file ] # 检测文件是否是目录,如果是,则返回 true
[ -f $file ] # 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
[ -g $file ] # 检测文件是否设置了 SGID 位,如果是,则返回 true
[ -k $file ] # 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true
[ -p $file ] # 检测文件是否是有名管道,如果是,则返回 true
[ -u $file ] # 检测文件是否设置了 SUID 位,如果是,则返回 true
[ -r $file ] # 检测文件是否可读,如果是,则返回 true
[ -w $file ] # 检测文件是否可写,如果是,则返回 true
[ -x $file ] # 检测文件是否可执行,如果是,则返回 true
[ -s $file ] # 检测文件是否为空(文件大小是否大于0),不为空返回 true
[ -e $file ] # 检测文件(包括目录)是否存在,如果是,则返回 true
4.4 test 命令
test
命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
具体的条件关系、布尔、逻辑、以及文件测试,可参考以上基本运算符。
cd /bin
if test -e ./notFile -o -e ./bash
thenecho -e "至少有一个文件存在!\n" # -e可输出转移字符
elseecho -e "两个文件都不存在!\n"
fi
五、控制流
5.1 条件语句
知道if...elif...else
的写法,其他的就都会写了。
if condition1
thencommand1
elif condition2
then command2
elsecommandN
fi
5.2 循环语句
在循环中也可以使用break
和continue
。
for var in item1 item2 ... itemN; do command1; command2… done;while condition
docommand
doneuntil condition
docommand
done
5.3 分支语句
case
取值后面必须为单词 in
,每一模式必须以右括号结束。
取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;
。
read aNum
case $aNum in1) echo '你选择了 1';;2) echo '你选择了 2';;
esac
六、函数
定义函数function关键字可选,不带任何参数,所有函数在使用前必须定义。
函数的返回值只能是一个介于 0~255的值,在调用该函数后通过 $?
来获得,参考预设变量。
# 函数定义,可以不用function
function demo(){echo "第一个参数为 $1"echo "第二个参数为 $2"echo "参数总数有 $# 个"echo "作为一个字符串输出所有参数 $*"return 8
}
# 函数调用
demo 1 2 3 4 5 6 7
echo "demo 返回值为 $?"
七、常用技巧
7.1 程序出错,中断整个脚本
linux所有命令执行返回的状态值:0表示没有错误,其他任何值表明有错误。
如果只检擦某一条指令的返回状态是否正确,可以使用下面的方式。
if[ $? -ne 0 ]thenreturn $?
fi
如果要检查shell脚本中的每一条指令的返回 状态,则可以用下面的方式。
set -e # 程序中任意一条命令返回非0的值,终端shell程序
相关文章:
使用Shell笔记总结
一、变量 1、定义变量不加$符号,使用变量要用$;等号两边不能直接接空格符;通常大写字符为系统默认变量,自行设定变量可以使用小写字符。 2、双引号内的特殊字符如 $ 等,可以保有其符号代表的特性,即可以有…...

反常积分的审敛法
目录 无穷先的反常积分的审敛法 定理1:比较判别法 例题: 比较判别法的极限形式: 例题: 定理3:绝对收敛准则 例题: 无界函数的反常积分收敛法 例题: 无穷先的反常积分的审敛法 定理1&#x…...
python实战应用讲解-【numpy专题篇】numpy常见函数使用示例(十三)(附python示例代码)
目录 Python numpy.ma.mask_or()函数 Python numpy.ma.notmasked_contiguous函数 Python numpy.ma.notmasked_edges()函数 Python numpy.ma.where()函数 Python Numpy MaskedArray.all()函数 Python Numpy MaskedArray.anom()函数 Python Numpy MaskedArray.any()函数 …...
Java设计模式(十九)—— 桥接模式
桥接模式定义如下:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 适合桥接模式的情景如下: 不希望抽象和某些重要的实现代码是绑定关系,可运行时动态决定抽象和实现者都可以继承的方式独立的扩充,程序在运行…...
多线程并发安全问题
文章目录并发安全问题线程安全性死锁定义实现一个死锁查看死锁解决死锁其他线程安全问题单例模式并发安全问题 线程安全性 线程安全是指我们所写的代码在并发情况下使用时,总是能表现出正确的行为;反之,未实现线程安全的代码,表…...
P1005 [NOIP2007 提高组] 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 ��nm 的矩阵,矩阵中的每个元素 ��,�ai,j 均为非负整数。游戏规则如下: 每次取数时须从每行各取走一个元素ÿ…...

百度云【人脸识别】
目录 1:百度云【人脸识别云服务】 2:Java-SDK文档 3:项目中测试 1:百度云【人脸识别云服务】 人脸识别云服务 包含实名认证、人脸对比、人脸搜索、活体检测等能力。灵活应用于金融、泛安防等行业场景,满足身份核验…...
强化模板模块
一、非类型模板参数 模板参数分为 类型模板参数(C模板的零基础讲解)和非类型模板参数。 看下面的代码 #define N 10 //T就是类型模板参数 template<class T> class Array { private:T a[N]; }; int main() {Array<int> a1;Array<double> a2;return 0; }上面…...
Vue.js学习详细课程系列--共32节(6 / 6)
Vue.js学习课程(6 / 6)29. 组件:参数验证知识点组件的数据综合例30. 组件:事件传递知识点v-on$emit综合例31. 组件:slot插槽知识点slot综合例32. 组件:组合slot知识点slot命名综合例29. 组件:参…...

【TFT屏幕】1.44寸彩屏
文章目录一.硬件层——引脚配置的移植二.应用层——显示函数的移植1. 移植显示一个字符函数2. 移植显示数字函数3.叠加方式选择一.硬件层——引脚配置的移植 宏定义的方式,直接修改引脚,实测可直接更改,非常方便移植 /*******************…...

vue3组合式api
文章目录组合式API介绍什么是组合式 API?为什么要有组合式 API?更好的逻辑复用更灵活的代码组织Option ApiOption Api的缺陷Composition Api更好的类型推导更小的生产包体积与选项式 API 的关系取舍组合式 API 是否覆盖了所有场景?可以同时使…...

Maven高级-私服
Maven高级-私服6,私服6.1 私服简介6.2 私服安装步骤1:下载解压步骤2:启动Nexus步骤3:浏览器访问步骤4:首次登录重置密码6.3 私服仓库分类6.4 本地仓库访问私服配置步骤1:私服上配置仓库步骤2:配置本地Maven对私服的访问权限步骤3:配置私服的访问路径6.5 私服资源上传…...
网络优化小结
网络基础知识 OSI七层网络架构 OSI简称Open System Intercnnect,开放式系统互联,是一个国际互联网标准制定的一个组织 应用层 实际应用场景,比如 浏览器、文件传输、电子邮件、文件服务、虚拟终端等; http、FTP、ssh等 表示层…...

Android 11.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(一)
1.前言 在11.0的系统rom定制化开发中,在原生系统中关于SystemUI下拉状态栏的通知栏的每条通知的背景是白色的四角的背景, 由于在产品设计中,需要把四角背景默认改成白色的圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 这就需要了解11.0的systemui的通…...
个人练习-Leetcode-1942. The Number of the Smallest Unoccupied Chair
题目链接:https://leetcode.cn/problems/the-number-of-the-smallest-unoccupied-chair/ 题目大意:给出一群人到达一个排队的时间和离开派对的时间[arr, lev]。有无数个座位,下标从0开始。当一个人在tm时刻离开时,如果一个人在tm…...
EMC经典问答85问(59-62问)
59、用双向可控硅控制直流电机的调速,但电机会干扰电源影响过零检则,造成不受控或速度妀变。请各位指教! 答 1: 出现这中现象的可能性有:1、电机属于非阻性负载,所以电路中产生相位移动,导致控制不准&#…...

Java面向对象 - 封装、继承和多态的综合练习(答案+知识点总结)第1关:封装、继承和多态进阶(一)+ 第2关:封装、继承和多态进阶(二)
目录 第1关:封装、继承和多态进阶(一) 报错总结 & 注意事项: 第2关:封装、继承和多态进阶(二) 源码: 报错总结 & 注意事项: 思维导图免费制作网站…...
小迪安全day20WEB漏洞-文件上传之基础及过滤方式
小迪安全day20WEB漏洞-文件上传之基础及过滤方式 什么是文件上传漏洞 有文件上传就可以测试是否有漏洞,关键看代码是否完备。 服务端代码未对客户端上传的文件进行严格的验证和过滤 漏洞危害 自定义网站后门,获取网站权限,属于高危漏洞。 上…...

LeetCode236.最近的公共祖先
求解最近公共祖先的算法 分为两个步骤: 求出两节点路径取两路径上最后一个相同的节点(该节点即为p,q节点的最近公共祖先) 节点路径的算法设计与实现 求节点路径即输入二叉树根节点与待求节点返回根节点到该节点路径上的所有节…...

【springcloud 微服务】Spring Cloud Alibaba整合Sentinel详解
目录 一、前言 二、环境准备 2.1 部署sentinel管控台 2.1.1 官网下载sentinel的jar包 2.1.2 启动控制台 2.1.3 访问控制台 2.2 整合springcloud-alibaba 2.2.1 引入相关依赖 2.2.2 修改配置文件 2.2.3 增加一个测试接口 2.2.4 接口测试 三、sentinel 流控规则使用 …...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...