一起来学Shell脚本编程(三)

前言

目前正在出一个Shell脚本编程系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

前面我们学习了Linux的一些基本命令,需要我们在终端手动去执行,但在处理一些复杂的操作就显得有点乏力,需要不停的执行,还很容易出错。有没有一种办法,可以帮助我们执行这一些列操作,方法当然有,那就是通过脚本去解决。

作为服务端开发,shell脚本编程还是要掌握一下的,可以做做基础性的运维,提高工作效率。

本系列主要以Linux Bash为主 ,好了, 废话不多说直接开整吧~

命令替换

Shell可以讲执行命令的结果暂存,下面看个例子:

bash 复制代码
DATE=`date`
echo "now date is $DATE"

输出结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./test.sh
now date is Mon Sep 18 09:26:49 CST 2023
[root@iZ2ze5vrnucj8nu52fq932Z shell]#

date本身是一个命令,可以输出当前系统的时间,我们将它的结果赋值给了变量DATE存储起来,在echo中输出

注意这里用的是反引号,而不是单引号

变量替换

变量替换形式:

shell 复制代码
|形式|	说明|
|-----  |----|
|`${var:-word}`|	如果变量 `var` 为空或已被删除(unset),那么返回 word,但不改变 `var` 的值。|
|`${var:=word}`|	如果变量 `var` 为空或已被删除(unset),那么返回 word,并将 `var` 的值设置为 word。|

下面看个例子:

bash 复制代码
var="hello"
unset var
echo "var is ${var:-world}"

echo "var is ${var}"

结果输出:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./test.sh
var is world
var is 
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

我们接着看另一个形式的:

bash 复制代码
var="hello"
unset var
echo "var is ${var:=world}"

echo "var is ${var}"

结果输出:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./test.sh
var is world
var is world
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

运算符

Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

算数运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awkexprexpr 最常用。

  • expr: 表达式计算工具
bash 复制代码
a=10
b=20
echo `expr $a + $b`

输出结果:

shell 复制代码
30

tip:

表达式和运算符之间要有空格, 乘(*)前边必须加反斜杠(\)才能实现乘法运算,另外表达式需要使用反引号

相关运算符:

bash 复制代码
运算符	说明	    举例
+	    加法	`expr $a + $b` 结果为 30。
-   	减法	`expr $a - $b` 结果为 10。
*	    乘法	`expr $a \* $b` 结果为  200。
/	    除法	`expr $b / $a` 结果为 2。
%	    取余	`expr $b % $a` 结果为 0。
=	    赋值	`a=$b` 将把变量 `b` 的值赋给 `a`。
==	    相等    用于比较两个数字,相同则返回 true。	[ $a == $b ] 返回 false。
!=	    不等    用于比较两个数字,不相同则返回 true。	[ $a != $b ] 返回 true。

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字

下面一起看个例子:

bash 复制代码
a=10
b=10


if [ $a -eq $b ]
then
  echo "$a -eq $b : a is equal to b"
else
  echo "not equal"
fi

输出结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./exp.sh
10 -eq 10 : a is equal to b

这里使用到了if流程控制语句结合关系运算符,这里需要注意下空格,流程控制的具体用法后边给大家讲,这里就不展开了

关系运算符:

shell 复制代码
运算符	说明
-eq	检测两个数是否相等,相等返回 true。同算数运算符`==`
-ne	检测两个数是否相等,不相等返回 true
-gt	检测左边的数是否大于右边的,如果是,则返回 true。
-lt	检测左边的数是否小于右边的,如果是,则返回 true。
-ge	检测左边的数是否大等于右边的,如果是,则返回 true。
-le	检测左边的数是否小于等于右边的,如果是,则返回 true。

布尔运算符

bash 复制代码
运算符	说明
!	非运算,表达式为 true 则返回 false,否则返回 true。
-o	或运算(or),有一个表达式为 true 则返回 true。
-a	与运算(and),两个表达式都为 true 才返回 true。

下面直接看一个例子:

bash 复制代码
a=10
b=10
c=20

if [ $a -lt $c -a $c -gt $b ];then echo "hhhh";else echo "nnnn";fi

这里的if是可以写到一行的,如果条件比较复杂的,这里还是建议大家展开写

输出:

shell 复制代码
hhhh

字符串运算符

bash 复制代码
运算符	说明	举例
=	检测两个字符串是否相等,相等返回 true。	[ $a = $b ] 返回 false。
!=	检测两个字符串是否相等,不相等返回 true。	[ $a != $b ] 返回 true。
-z	检测字符串长度是否为0,为0返回 true。	[ -z $a ] 返回 false。
-n	检测字符串长度是否为0,不为0返回 true。	[ -n $a ] 返回 true。
str	检测字符串是否为空,不为空返回 true。	[ $a ] 返回 true。

下面看个例子

bash 复制代码
a="hello"
b="hello"


if [ $a = $b ];then echo "hello";else echo "no";fi

if [ $a ];then echo "$a is not empty";else echo "$a is empty";fi

输出:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./exp.sh
hello
hello is not empty
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

bash 复制代码
操作符	说明	举例

-b file	检测文件是否是块设备文件,如果是,则返回 true。	[ -b $file ] 返回 false。

-c file	检测文件是否是字符设备文件,如果是,则返回 true。	[ -c $file ] 返回 false。

-d file	检测文件是否是目录,如果是,则返回 true。	[ -d $file ] 返回 false。

-f file	检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。	[ -f $file ] 返回 true。

-g file	检测文件是否设置了 SGID 位,如果是,则返回 true。	[ -g $file ] 返回 false。

-k file	检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。	[ -k $file ] 返回 false。

-p file	检测文件是否是具名管道,如果是,则返回 true。	[ -p $file ] 返回 false。

-u file	检测文件是否设置了 SUID 位,如果是,则返回 true。	[ -u $file ] 返回 false。

-r file	检测文件是否可读,如果是,则返回 true。	[ -r $file ] 返回 true。

-w file	检测文件是否可写,如果是,则返回 true。	[ -w $file ] 返回 true。

-x file	检测文件是否可执行,如果是,则返回 true。	[ -x $file ] 返回 true。

-s file	检测文件是否为空(文件大小是否大于0),不为空返回 true。	[ -s $file ] 返回 true。

-e file	检测文件(包括目录)是否存在,如果是,则返回 true。	[ -e $file ] 返回 true。

下面一起看个例子:

bash 复制代码
#!/bin/bash
file="./test.sh"

if [ -e $file ]; then echo "file exists";else echo "file does not exist";fi

输出结果:

shell 复制代码
[root@iZ2ze5vrnucj8nu52fq932Z shell]# ./exp.sh
file exists
[root@iZ2ze5vrnucj8nu52fq932Z shell]# 

结束语

大家平时在工作的时候就可以灵活运用起来了,多用用就熟悉了,大部分项目中都会用到脚本帮助我们去做一些自动化的工作,从而提高效率,还不容易出错~

本着把自己知道的都告诉大家,如果本文对有所帮助,点赞+关注鼓励一下呗~

Shell脚本编程相关文章

往期Linux相关文章

往期面试题相关文章

项目源码(源码已更新 欢迎star⭐️)

往期设计模式相关文章

设计模式项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)

相关推荐
嘉伟桑27 分钟前
Python调用电价API返回JSON示例:分时电价、现货电价和字段解析
后端
武子康43 分钟前
Shippy:确定性工具、会话级 Sandbox 与 Live-Data Eval(4 类收敛 + 7 步实现方案 + 6 类评测指标)
前端·人工智能·后端
我叫黑大帅1 小时前
我为什么单一消费者的场景下,要用 Redis List 当消息队列?
redis·后端·面试
AskHarries1 小时前
文件上传系统
后端
止语Lab2 小时前
好的 DX 不等于少写代码——三种语言的摩擦力设计课
后端
吃饱了得干活2 小时前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比
后端·python·langchain
程序员天天困2 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
Huiturn2 小时前
GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
后端
用户298698530142 小时前
Python 实现 Excel 与 Markdown 互转的实用指南
后端·python·excel
用户77283104908402 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端