当前位置: 首页 > news >正文

使用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 循环语句

在循环中也可以使用breakcontinue

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、定义变量不加$符号&#xff0c;使用变量要用$&#xff1b;等号两边不能直接接空格符&#xff1b;通常大写字符为系统默认变量&#xff0c;自行设定变量可以使用小写字符。 2、双引号内的特殊字符如 $ 等&#xff0c;可以保有其符号代表的特性&#xff0c;即可以有…...

反常积分的审敛法

目录 无穷先的反常积分的审敛法 定理1&#xff1a;比较判别法 例题&#xff1a; 比较判别法的极限形式&#xff1a; 例题&#xff1a; 定理3&#xff1a;绝对收敛准则 例题&#xff1a; 无界函数的反常积分收敛法 例题&#xff1a; 无穷先的反常积分的审敛法 定理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设计模式(十九)—— 桥接模式

桥接模式定义如下&#xff1a;将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 适合桥接模式的情景如下&#xff1a; 不希望抽象和某些重要的实现代码是绑定关系&#xff0c;可运行时动态决定抽象和实现者都可以继承的方式独立的扩充&#xff0c;程序在运行…...

多线程并发安全问题

文章目录并发安全问题线程安全性死锁定义实现一个死锁查看死锁解决死锁其他线程安全问题单例模式并发安全问题 线程安全性 线程安全是指我们所写的代码在并发情况下使用时&#xff0c;总是能表现出正确的行为&#xff1b;反之&#xff0c;未实现线程安全的代码&#xff0c;表…...

P1005 [NOIP2007 提高组] 矩阵取数游戏

题目描述 帅帅经常跟同学玩一个矩阵取数游戏&#xff1a;对于一个给定的 &#xfffd;&#xfffd;nm 的矩阵&#xff0c;矩阵中的每个元素 &#xfffd;&#xfffd;,&#xfffd;ai,j​ 均为非负整数。游戏规则如下&#xff1a; 每次取数时须从每行各取走一个元素&#xff…...

百度云【人脸识别】

目录 1&#xff1a;百度云【人脸识别云服务】 2&#xff1a;Java-SDK文档 3&#xff1a;项目中测试 1&#xff1a;百度云【人脸识别云服务】 人脸识别云服务 包含实名认证、人脸对比、人脸搜索、活体检测等能力。灵活应用于金融、泛安防等行业场景&#xff0c;满足身份核验…...

强化模板模块

一、非类型模板参数 模板参数分为 类型模板参数(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学习课程&#xff08;6 / 6&#xff09;29. 组件&#xff1a;参数验证知识点组件的数据综合例30. 组件&#xff1a;事件传递知识点v-on$emit综合例31. 组件&#xff1a;slot插槽知识点slot综合例32. 组件&#xff1a;组合slot知识点slot命名综合例29. 组件&#xff1a;参…...

【TFT屏幕】1.44寸彩屏

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

vue3组合式api

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

Maven高级-私服

Maven高级-私服6&#xff0c;私服6.1 私服简介6.2 私服安装步骤1:下载解压步骤2:启动Nexus步骤3:浏览器访问步骤4:首次登录重置密码6.3 私服仓库分类6.4 本地仓库访问私服配置步骤1:私服上配置仓库步骤2:配置本地Maven对私服的访问权限步骤3:配置私服的访问路径6.5 私服资源上传…...

网络优化小结

网络基础知识 OSI七层网络架构 OSI简称Open System Intercnnect&#xff0c;开放式系统互联&#xff0c;是一个国际互联网标准制定的一个组织 应用层 实际应用场景&#xff0c;比如 浏览器、文件传输、电子邮件、文件服务、虚拟终端等&#xff1b; 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

题目链接&#xff1a;https://leetcode.cn/problems/the-number-of-the-smallest-unoccupied-chair/ 题目大意&#xff1a;给出一群人到达一个排队的时间和离开派对的时间[arr, lev]。有无数个座位&#xff0c;下标从0开始。当一个人在tm时刻离开时&#xff0c;如果一个人在tm…...

EMC经典问答85问(59-62问)

59、用双向可控硅控制直流电机的调速&#xff0c;但电机会干扰电源影响过零检则&#xff0c;造成不受控或速度妀变。请各位指教&#xff01; 答 1: 出现这中现象的可能性有&#xff1a;1、电机属于非阻性负载&#xff0c;所以电路中产生相位移动&#xff0c;导致控制不准&#…...

Java面向对象 - 封装、继承和多态的综合练习(答案+知识点总结)第1关:封装、继承和多态进阶(一)+ 第2关:封装、继承和多态进阶(二)

目录 第1关&#xff1a;封装、继承和多态进阶&#xff08;一&#xff09; 报错总结 & 注意事项&#xff1a; 第2关&#xff1a;封装、继承和多态进阶&#xff08;二&#xff09; 源码&#xff1a; 报错总结 & 注意事项&#xff1a; 思维导图免费制作网站&#xf…...

小迪安全day20WEB漏洞-文件上传之基础及过滤方式

小迪安全day20WEB漏洞-文件上传之基础及过滤方式 什么是文件上传漏洞 有文件上传就可以测试是否有漏洞&#xff0c;关键看代码是否完备。 服务端代码未对客户端上传的文件进行严格的验证和过滤 漏洞危害 自定义网站后门&#xff0c;获取网站权限&#xff0c;属于高危漏洞。 上…...

LeetCode236.最近的公共祖先

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

【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 流控规则使用 …...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...