Linux Shell编程入门到实战(三)

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

上篇请阅读:Linux Shell编程入门到实战(二)

在这里插入图片描述

一、 Shell内置命令

1. 内置命令介绍

Shell 内置命令,就是由 Bash Shell 自身提供的命令,而不是文件系统中的可执行文件。

使用type 来确定一个命令是否是内置命令:

type 命令

在这里插入图片描述
通常来说,内置命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘 I/O,还需要 fork 出一个单独的进程来执行,执行完成后再退出。而执行内置命令相当于调用当前 Shell 进程的一个函数, 还是一个进程, 减少了上下文切换。

2. 内置命令列表(重要)

命令说明
:扩展参数列表,执行重定向操作
.读取并执行指定文件中的命令(在当前 shell 环境中)
alias为指定命令定义一个别名
bg将作业以后台模式运行
bind将键盘序列绑定到一个 readline 函数或宏
break退出 for、while、select 或 until 循环
builtin执行指定的 shell 内建命令
caller返回活动子函数调用的上下文
cd将当前目录切换为指定的目录
command执行指定的命令,无需进行通常的 shell 查找
compgen为指定单词生成可能的补全匹配
complete显示指定的单词是如何补全的
compopt修改指定单词的补全选项
continue继续执行 for、while、select 或 until 循环的下一次迭代
declare声明一个变量或变量类型
dirs显示当前存储目录的列表
disown从进程作业表中刪除指定的作业
echo将指定字符串输出到 STDOUT
enable启用或禁用指定的内建shell命令
eval将指定的参数拼接成一个命令,然后执行该命令
exec用指定命令替换 shell 进程
exit强制 shell 以指定的退出状态码退出
export设置子 shell 进程可用的变量
fc从历史记录中选择命令列表
fg将作业以前台模式运行
getopts分析指定的位置参数
hash查找并记住指定命令的全路径名
help显示帮助文件
history显示命令历史记录
jobs列出活动作业
kill向指定的进程 ID(PID) 发送一个系统信号
let计算一个数学表达式中的每个参数
local在函数中创建一个作用域受限的变量
logout退出登录 shell
mapfile从 STDIN 读取数据行,并将其加入索引数组
popd从目录栈中删除记录
printf使用格式化字符串显示文本
pushd向目录栈添加一个目录
pwd显示当前工作目录的路径名
read从 STDIN 读取一行数据并将其赋给一个变量
readarray从 STDIN 读取数据行并将其放入索引数组
readonly从 STDIN 读取一行数据并将其赋给一个不可修改的变量
return强制函数以某个值退出,这个值可以被调用脚本提取
set设置并显示环境变量的值和 shell 属性
shift将位置参数依次向下降一个位置
shopt打开/关闭控制 shell 可选行为的变量值
source读取并执行指定文件中的命令(在当前 shell 环境中)
suspend暂停 Shell 的执行,直到收到一个 SIGCONT 信号
test基于指定条件返回退出状态码 0 或 1
times显示累计的用户和系统时间
trap如果收到了指定的系统信号,执行指定的命令
type显示指定的单词如果作为命令将会如何被解释
typeset声明一个变量或变量类型。
ulimit为系统用户设置指定的资源的上限
umask为新建的文件和目录设置默认权限
unalias刪除指定的别名
unset刪除指定的环境变量或 shell 属性
wait等待指定的进程完成,并返回退出状态码

3. alisa内置命令

介绍

alisa 用于给命令创建别名。若该命令且不带任何参数则显示当前 Shell 进程中的所有别名列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ln02JSNH-1682044940248)(assets/image-20200630084814561.png)]

上面是系统为了方便命令操作默认将部分命令创建为别名 ll 的命令与ls -l的效果一样, 就是因为ll是别名

alias别名定义语法

alias 别名='命令'

unalias 别名删除语法

删除指定的别名

unalias 别名

删除当前Shell环境中所有的别名

unalias -a

注意: 以上2种方式删除都是临时删除当前Shell的别名, 如果想永久删除必须去配置文件中手动删除

4. echo内置命令

echo 是一个 Shell 内置命令,用于在终端输出字符串,并在最后默认加上换行符
echo输出语法

默认输出换行语法

echo 字符串

输出不换行语法

echo -n  字符串

输出演示

1.创建echo1.sh

touch demo.sh

2.编辑文件内容并保存

vim demo.sh

文件内容

#!/bin/bash
echo "hello"
echo "world"
echo -n "itheima "
echo -n "shell "

3.运行echo1.sh文件观察效果
在这里插入图片描述

在这里插入图片描述

4.1 echo输出转义字符

  1. \n 转义字符

    用于echo输出字符串非结尾处的换行, 但是默认echo无法解析\n 转义字符


  2. -e 参数

    -e 参数用于解析转义字符

    echo -e '字符串中含有转义字符'
    

    演示
    在这里插入图片描述


  1. \c 转义字符

    \c 用于强制清除echo的结尾换行输出

    演示
    在这里插入图片描述

5.read内置命令

介绍

read 是 Shell 内置命令,用于从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从终端控制台读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据。

语法

read [-options] [var1 var2 ...]

options表示选项,如下表所示;var表示用来存储数据的变量,可以有一个,也可以有多个。

optionsvar都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

options支持的参数

选项说明
-a array把读取的数据赋值给数组 array,从下标 0 开始。
-d delimiter用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。
-e在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。
-n num读取 num 个字符而不是整行字符
-p prompt显示提示信息,提示内容为 prompt
-r原样读取(Raw mode),不把反斜杠字符解释为转义字符。
-s静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。
-t seconds设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败
-u fd使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。

5.1 多个变量赋值

需求

使用 read 命令给多个变量赋值

演示

创建文件

touch read1.sh

编辑文件

vim read1.sh

read1.sh文件内容

#!/bin/bash
read -p "请输入姓名,年龄,爱好: " name age hobby
echo "姓名:$name"
echo "年龄:$age"
echo "爱好:$hobby"

运行效果
在这里插入图片描述

5.2 读取一个字符

需求

从终端控制台只读取一个字符

演示

创建文件

touch read2.sh

编辑文件

vim read2.sh

read2.sh文件内容

#!/bin/bash
read -n 1 -p '请输入一个字符: ' char
printf '\n'
echo '你输入的字符为:'$char

注意

-n 1只读取一个字符。运行脚本后,只要输入的一个字符,立即读取结束,不用等待用户按下回车键。

printf '\n'语句用于换行,否则 echo 的输出结果会和用户输入的内容位于同一行,不容易区分

运行效果
在这里插入图片描述

5.3 限制时间输入

需求

在终端控制台输入时, 设置指定时间内输入密码

演示

创建文件

touch read3.sh

编辑文件

vim read3.sh

read3.sh文件内容

#!/bin/bash
read -t 20 -sp '请输入密码(20秒内):' pwd1
printf '\n'
read -t 20 -sp '请再次输入密码(20秒内):' pwd2
printf '\n'
if
        [ $pwd1 == $pwd2 ]
then
        echo '密码与确认密码一致, 验证通过'
else
        echo '密码与确认密码不一致,验证失败'
fi

执行文件运行效果

在这里插入图片描述

6. exit内置命令

exit 用于退出当前 Shell 进程结束运行,并返回一个退出状态;使用$?可以接收这个退出状态.

exit 命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。

一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了。

语法

正确退出语法

exit

错误退出语法

exit 非0数字  # 介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败

exit应用场景

1.结束当前Shell进程

2.当Shell 进程执行出错退出时,可以返回不同的状态值代表不同的错误

比如打开一个文件时,可以返回1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

7. declare内置命令

declare命令用于声明 shell 变量。可用来声明变量并设置变量的属性,也可用来显示shell函数。若不加上任何参数,则会显示全部的shell变量与函数(与执行set指令的效果相同)。

declare命令作用

1.declare设置变量的属性

2.查看全部Shell变量与函数

3.实现关联数组变量

不同于普通数组, 关联数组的下标是字符串, 通过字符串下标操作数据

语法

1.declare设置变量的属性语法

declare [+/-][aArxif][变量名称=设置值]
+/-"-“可用来指定变量的属性,”+"则是取消变量所设的属性。
a设置为普通索引数组
A设置为key-value关联数组
r将变量设置为只读, 也可以使用readonly
x设置变量成为环境变量,也可以使用export
i设置为整型变量。
f设置为一个函数变量

2.查看全部Shell变量与函数定义语法

declare [-fF]

declare 后无参数, 查询全部Shell变量与函数定义

-f  仅查询显示函数定义。

-F 仅查询显示函数名字

3.实现key-value关联数组变量语法

关联数组也称为“键值对(key-value)”数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。

declare -A 关联数组变量名=([字符串key1]=值1 [字符串key2]=值2 ...)

declare也可以用于定义普通数组, -a 参数创建普通或索引数组 -A 创建关联数组

declare -a 关联数组变量名=(值1 值2 ...)

declare -a 关联数组变量名=([0]=值1 [1]=值2 ...)

获取指定key的值

${关联数组变量名[key]}

获取所有值

${关联数组变量名[*]} # 方式1
${关联数组变量名[@]} # 方式2

示例:查看当前Shell所有函数名

查看所有变量与所有函数

declare

在这里插入图片描述

查看所有函数与定义

declare -f

查询所有函数名列表

declare -F

在这里插入图片描述

注意: 使用参数-A 才是关联数组 , 关联数组无法使用索引获取

沙发

二、Shell运算符

1. expr命令

expr 是 evaluate expressions 的缩写,译为“表达式求值”。Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等。

1.1 求值表达式

计算语法

expr 算术运算符表达式

注意: 运算表达式

获取计算结果赋值给新变量语法

result=`expr 算术运算符表达式`

演示

在这里插入图片描述

注意: 运算符表达式中每个数字与符号之间要有空格

1.2 字符串语法

加粗样式计算字符串的长度语法

expr length 字符串
# 例如: expr length "itheima"  返回: 7

截取字符串语法

expr substr 字符串 start end
# start 截取字符串的起始位置, 从1开始
# end 截取字符串的结束位置, 包含这个位置截取
# 例如 expr substr "itheima" 1 2  返回: it

获取第一个字符在字符串中出现的位置语法

expr index 被查找字符串  需要查找的字符
# 例如 expr index "itheima" t  会返回: 2 

正则表达式匹配1语法

expr match 字符串 正则表达式
# 正则表达式默认带有^ ,  代表以什么开头
# 返回值为符合匹配字符的长度, 否则返回为0
# 例如: expr match "itheima" ".*m"  会返回: 6
# 正则表达式通配符"."代表任意一个字符
# 正则表达式通配符"*"代表签名的字符可以出现0到多次
# ".*m" 含义为匹配字符串中m前面的字符串长度 

正则表表达式匹配2语法, 功能与语法1一样

expr 字符串 : 正则表达式
# 正则表达式默认带有^ ,  代表以什么开头
# 返回值为符合匹配字符的长度, 否则返回为0
# 例如: expr "itheima" : ".*m"  会返回: 6

1.3 (())命令详解

  • 双小括号 (( )) , 用于进行数学运算表达式的执行 , 将数学运算表达式放在(())之间。

  • 可以使用$获取 (( )) 表达式命令的结果,这和使用$获得变量值是一样的。

语法

((表达式))

用法

运算操作符/运算命令说明
((a=1+6))
((b=a-1))
((c=a+b))
这种写法可以在计算完成后给变量赋值。以 ((b=a-1)) 为例,
即将 a-1 的运算结果赋值给变量 c。 注意,使用变量时不用加$前缀,
(( )) 会自动解析变量名。
a=$((1+6)
b=$((a-1))
c=$((a+b))
可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,
也即获取整个表达式的值。以 c=$((a+b)) 为例,即将 a+b 这个
表达式的运算结果赋值给变量 c。 注意,如果 c=((a+b)) 这样的写
法是错误的,不加$就不能取得表达式的结果。
((a>7 && b==c))(( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。
echo $((a+10))需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。
((a=3+5, b=a+10))对多个表达式同时进行计算, 多表表达式使用","号隔开

注意: 符号之间有无空格都可以 , (( a = 1 + 6 )) 等价于 ((a=1+6))

示例

需求

# 计算1+6赋值给变量a

# 计算变量a-1赋值给变量b

# 计算变量a+变量b赋值给变量c

# 打印变量a,变量b, 变量c的值

# $赋值写法

# (())多个表达式计算赋值

# echo输出直接使用(())

# (()) 用于逻辑表达式 在if中使用

calculatej2.sh脚本代码

#!/bin/bash
# 计算1+6赋值给变量a
((a=1+6))

# 计算变量a-1赋值给变量b
((b=a-1))

# 计算变量a+变量b赋值给变量c
((c=a+b))

# 打印变量a,变量b, 变量c的值
echo "a=${a},b=${b},c=${c}"

# $赋值写法
a=$((1+6)) b=$((a-1)) c=$((a+b))
echo "a=${a},b=${b},c=${c}"

# (())多个表达式计算赋值
((a=1+6,b=a-1,c=a+b))
echo "a=${a},b=${b},c=${c}"

# echo输出直接使用(())
echo "1+6=$((1+6))"

# (()) 用于逻辑表达式 在if中使用
if ((a>7 && b==c))
then
        echo "a>7 && b==c 成立"
else
        echo "a>7 && b==c 不成立"
fi

结果
在这里插入图片描述

1.4 let命令详解

介绍

let 命令和双小括号 (( )) 在数字计算方面功能一样. 但是没有(())功能强大, let只能用于赋值计算, 不能直接输出, 不可以条件判断一起使用

语法

let 赋值表达式

注意

  1. 语法功能等价于((表达式))

  2. 多个表达式之间使用空格, 不是","号

  3. 对于类似let a+b这样的写法,Shell 虽然计算了 a+b 的值,但却将结果丢弃, 如果 echo let a+b 会直接输出字符串 a+b ;若不想这样,可以使用let sum=a+b将 a+b 的结果保存在变量 sum 中。

在这里插入图片描述

输出建议使用(())

示例

需求

# 计算变量a-1赋值给变量b
# 计算变量a+变量b赋值给变量c
# 打印变量a,变量b, 变量c的值
# let多个表达式计算赋值

calculate3.sh脚本代码

#!/bin/bash
# 计算1+6赋值给变量a
let a=1+6

# 计算变量a-1赋值给变量b
let b=a-1

# 计算变量a+变量b赋值给变量c
let c=a+b

# 打印变量a,变量b, 变量c的值
echo "a=${a},b=${b},c=${c}"

# let多个表达式计算赋值
let a=1+6 b=a-1 c=a+b
echo "a=${a},b=${b},c=${c}"

运行效果
在这里插入图片描述

1.5 $[]命令详解

介绍

和 (())、let 命令类似,$[] 也只能进行整数运算。只能对单个表达式的计算求值与输出

语法

$[表达式]
  1. $[] 会对表达式进行计算,并取得计算结果

  2. 表达式内部不可以赋值给变量

示例

calculate4.sh脚本代码

#!/bin/bash
# 计算1+6赋值给变量a
a=$[1+6]

# 计算变量a-1赋值给变量b
b=$[a-1]

# 计算变量a+变量b赋值给变量c
c=$[a+b]

# 打印变量a,变量b, 变量c的值
echo "a=${a},b=${b},c=${c}"

# 直接输出
echo "$[1+6],$[7-1],$[7+6]"

运行结果

在这里插入图片描述

1.6 bc命令详解

介绍

Bash shell内置了对整数运算的支持,但是并不支持浮点运算,而 linux bc (basic calculator)命令可以很方便的进行浮点运算. bc命令是Linux简单的计算器,能进行进制转换与计算。能转换的进制包括十六进制、十进制、八进制、二进制等。可以使用的运算符号包括(+)加法、(-)减法、(*)乘法、(/)除法、(^)指数、(%)余数等
bc命令

bc [options] [参数]
选项说明
-hhelp,帮助信息
-vversion,显示命令版本信息
-lmathlib, 使用标准数学库, 例如使用内置函数就需要使用这个参数
-iinteractive, 强制交互
-wwarn, 显示 POSIX 的警告信息
-sstandard, 使用 POSIX 标准来处理
-qquiet, 不显示欢迎信息

默认使用bc命令后回车会有很多欢迎信息, 可以使用 bc -q 回车后不会有欢迎信息

参数

文件: 指定包含计算任务的文件。

bc执行计算任务的文件

创建task.txt文件, 编辑文件内容(一个计算表达式一行)

108*67+12345
58+2007*11

执行命令

在这里插入图片描述

可以使用 quit 命令退出bc

内置变量

变量名作 用
scale指定精度,也即小数点后的位数, 对计算结果指定保留小数;默认为 0,也即不使用小数部分。
ibase指定输入的数字的进制,默认为十进制。
obase指定输出的数字的进制,默认为十进制。
last 或者 .获取最近计算打印结果的数字

内置数学函数

函数名作用
s(x)计算 x 的正弦值,x 是弧度值。
c(x)计算 x 的余弦值,x 是弧度值。
a(x)计算 x 的反正切值,返回弧度值。
l(x)计算 x 的自然对数。
e(x)求 e 的 x 次方。
j(n, x)贝塞尔函数,计算从 n 到 x 的阶数。

作用

通常在linux下bc当计算器用, 具体有3个用法

  1. bc中互动式的数学运算
  2. shell中非互动式的管道运算
  3. shell中非互动式的输入重定向运算

bc中互动式的数学运算

使用 bc -q 命令,回车即可, 直接进行计算器进行运算

shell中非互动式的管道运算

在 Shell 脚本中,我们可以借助管道使用 bc 计算器。

直接进行bc的表达式计算输出

echo "expression" | bc [options]

“expression” 表达式必须复合bc命令要求的公式

“expression” 表达式里面可以引用shell变量

例如: Shell变量 a=2 在表达式里面引用的语法: $a

将bc计算结果赋值给Shell变量

# 第一种方式
var_name=`echo "expression" | bc [options]`

# 第二种方式
var_name=$(echo "expression" | bc [options])

$() 与 `` 功能一样, 都是执行里面的命令

区别

​ `` 是所有linux系统支持的方式, 兼容性较好, 但是容易与引号产生混淆

​ $() 不是所有linux系统都支持的方式, 兼容性较差, 但是不容易产生混淆

演示

在这里插入图片描述

引用shell变量进行计算

在这里插入图片描述

注意 b是bc中定义的新变量, 与shell变量没有任何关系, 所以不可以在shell中获取b变量

进制转换

在这里插入图片描述shell中非互动式的输入重定向运算
将计算表达式输出给bc去执行, 特点类似于文件中输入,可以输入多行表达式, 更加清晰

# 第一种方式
var_name=`bc [options] << EOF
第一行表达式1
第二行表达式2
...
EOF
`

# 第二种方式
var_name=$(bc [options] << EOF
第一行表达式1
第二行表达式2
...
EOF
)

var_name 这是Shell变量的名字
bc 执行bc的命令
EOF..EOF 输入流的多行表达式
含义: 将EOF中间多行表达式输入给到bc去执行, j将bc执行的结果给到Shell变量var_name

2. 算术运算符

算术运算符介绍

下表列出了常用的算术运算符,假定变量 a 为 1,变量 b 为 2:

运算符说明举例
+加法expr $a + $b 结果为 3
-减法expr $a - $b 结果为 -1
*乘法expr $a \* $b 结果为 2
/除法expr $b / $a 结果为 2
%取余expr $b % $a 结果为 0
=赋值a=$b 将把变量 b 的值赋给 a

四则运算中如果使用了(), 也需要转义 \( 1 + 1 \)

演示

operation1.sh脚本代码

#!/bin/bash
a=1 b=2          # 声明变量a=1和b=2
echo "a=${a} b=${b}"
echo "a + b = `expr $a + $b`"
echo "a * b = `expr $a \* $b`"
echo "a - b = `expr $a - $b`"
echo "a * b = `expr $a \* $b`"
echo "b / a = `expr $b / $a`"
echo "b % a = `expr $b % $a`"

echo -n "a == b 结果为 "
if [ $a == $b ]       # 注意变量与符号之间都要有空格
then
        echo true
else
        echo false
fi

echo -n "a != b 结果为 "
if [ $a != $b ]        # 注意变量与符号之间都要有空格
then
        echo true
else
        echo false
fi

在这里插入图片描述

3. 比较运算符

3.1整数比较运算符

语法

下表列出了常用的比较运算符,假定变量 a 为 1,变量 b 为 2:

运算符说明举例
-eqequals 检测两个数是否相等,相等返回 0, 否则返回1。[ $a -eq $b ] 返回 1。
-nenot equals检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 0。
-gtgreater than检测左边的数是否大于右边的,
是返回0, 否则1
[ $a -gt $b ] 返回 1。
-ltlower than检测左边的数是否小于右边的,
是返回0, 否则1
[ $a -lt $b ] 返回 0。
-gegreater equals检测左边的数是否大于等于右边的,
是返回0, 否则1
[ $a -ge $b ] 返回 1。
-lelower equals检测左边的数是否小于等于右边的,
是返回0, 否则1
[ $a -le $b ] 返回 0。
<检测左边的数是否小于右边的,
是返回0, 否则1
(($a<$b)) 返回0
<=检测左边的数是否小于等于右边的,
是返回0, 否则1
(($a<=$b)) 返回0
>检测左边的数是否大于右边的,
是返回0, 否则1
(($a>$b)) 返回1
>=检测左边的数是否大于等于右边的,
是返回0, 否则1
(($a>=$b)) 返回1

注意: 整数比较运算符只支持整数,不支持小数与字符串(字符串比较后续讲解),除非字符串的值是整数数字。

每个命令都有返回值, 这个后面我们会讲解退出状态再具体说明, 返回0代表成功, 返回1代表失败

演示

operation2.sh脚本代码

#!/bin/bash
a=1 b=2
echo "a=${a} b=${b}"
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

if (($a > $b))
then
   echo "$a > $b: a 大于 b"
else
   echo "$a > $b: a 不大于 b"
fi
if (($a < $b))
then
   echo "$a < $b: a 小于 b"
else
   echo "$a < $b: a 不小于 b"
fi
if (($a >= $b))
then
   echo "$a >= $b: a 大于或等于 b"
else
   echo "$a >= $b: a 小于 b"
fi
if (($a <= $b))
then
   echo "$a <= $b: a 小于或等于 b"
else
   echo "$a <= $b: a 大于 b"
fi

运行效果
在这里插入图片描述

3.2 字符串比较运算符

可以比较2个变量, 变量的类型可以为数字(整数,小数)与字符串

语法

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

字符串比较可以使用 [[]][] 2种方式

运算符说明举例
== 或 =相等。用于比较两个字符串或数字,相同则返回 0。可以使用=[ $a == $b ] 返回1
[ $a = $b ] 返回 1
[[ $a == $b ]] 返回1
[[ $a = $b ]] 返回1
!=不相等。用于比较两个字符串或数字,不相同则返回 0。[ $a != $b ] 返回 0
[[ $a != $b ]] 返回 0
<小于, 用于比较两个字符串或数字, 小于返回0, 否则返回1[ $a \< $b ] 返回 0
[[ $a < $b ]] 返回 0
>大于, 用于比较两个字符串或数字, 大于返回0, 否则返回1[ $a \> $b ] 返回 1
[[ $a > $b ]] 返回 1
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 1。
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n “$a” ] 返回 0。
$检测字符串是否不为空,不为空返回 0 ,否则返回1。[ $a ] 返回 0。

字符串比较没有 <= 可以通过 [[ "a" < "b" && "a" = "b" ]]

演示

operation6.sh脚本代码

#!/bin/bash

a="zhangsan" b="lisi" c=1 d=2
echo "a=${a},b=${b},c=${c},d=${d}"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi

if [[ $a > $b ]]
then
   echo "$a > $b : a 大于 b"
else
   echo "$a > $b: a 不大于 b"
fi

if [ $a \> $b ]
then
   echo "$a > $b : a 大于 b"
else
   echo "$a > $b: a 不大于 b"
fi

if [[ $c > $d ]]
then
   echo "$c > $d : c 大于 d"
else
   echo "$c > $d: c 不大于 d"
fi

if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi

if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi

if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

运行效果

[外链图片转存中…(img-BXP8Wu1p-1683186bea4edeb3707635066eaed2.png)

3.3 [[]][] 的区别

区别1:

  • [[]] 不会有word splitting发生
  • [] 会有word splitting发生

word splitting介绍

会将含有空格字符串进行分拆分割后比较

示例
在这里插入图片描述

通过 $? 获取上一个命令的退出状态, 0代表成功, 1代表失败

区别2:
转义字符

区别说明

[[]]< 不需要转义, 格式为 [[ 字符串1 < 字符串2 ]]

[] 需要对 < , >等 转义 , 格式为 [ 字符串1 \< 字符串2 ]

在这里插入图片描述

3.4总结

  1. 了解有哪些比较运算符

    整数比较运算符

    比较方式: [](())

    方式1: [ 整数1 options 整数2 ]

    options: -eq -gt -ge -lt -le -ne

    方式2: ((整数1 options 整数2))

    options: < <= > >=

    字符串,数字比较运算符

    介绍: 可以比较2个变量, 变量的类型可以为字符串, 数字(整数,小数)

    比较方式: [][[]]

    方式1: [ 变量1 options 整数2 ]

    options: <,>,==,=,!=

    <,> 需要转义

    ​ 比较含有空格的字符串, 需要使用""号括起来, 否则会分割拆分

    方式2: [[ 变量1 options 变量2]]

    options: <,>,==,=,!=

    <,> 不需要转义

  2. 推荐使用哪个比较运算符?

    [[ 表达式 ]] 即可以实现数字和字符串比较, 并且不需要转义, 不会分割

4 布尔运算符

介绍

运算符说明举例
!非运算,取反, 表达式为 true 则返回 false,
否则返回 true。
[ ! false ] 返回 true。
-oor 或运算,有一个表达式为 true 则返回 true。[ 表达式1 -o 表达式2 ] 返回 true。
-aand 与运算,两个表达式都为 true 才返回 true。[ 表达式1 -a 表达式2 ] 返回 false。

注意布尔运算符只能放在[] 才有效

以后常使用布尔运算符与test命令进行连接条件测试, 后续讲解

演示

operation4.sh脚本代码脚本代码

#!/bin/bash
a=1 b=2

if [ $a -lt 2 -a $b -gt 10 ]
then
   echo "$a 小于 2 且 $b 大于 10 : 返回 true"   
else
   echo "$a 小于 2 且 $b 大于 10 : 返回 false"  # $b -gt 10不成立, 输出这个表达式
fi

if [ $a -lt 10 -o $b -gt 10 ]
then
   echo "$a 小于 10 或 $b 大于 10 : 返回 true"  # $a -lt 10 成立, 输出这个表达式
else
   echo "$a 小于 10 或 $b 大于 10 : 返回 false"
fi

if [ ! $a -gt $b ]
then
   echo "$a 大于 $b 取反 : 返回 true"
else
   echo "$a 大于 $b 取反 : 返回 false"   # $a -gt $b 为true , 取反为false, 输出这个表达式
fi

运行效果

在这里插入图片描述

5 逻辑运算符

介绍

运算符说明举例
&&逻辑的 AND[[ 表达式1 && 表达式2 ]] 返回 false
||逻辑的 OR`[[ 表达式1

注意: 使用&&|| 的运算符必须放在 [[]](())中才有效, 否则报错

-a-o 的运算符必须放在 [] 在才有效 或 test命令中

!可以用在[],[[]]中, 不可以在(())

演示

operation5.sh脚本代码

#!/bin/bash

a=1 b=2

if [[ $a -lt 10 && $b -gt 10 ]]
then
   echo "返回 true" 
else
   echo "返回 false"  # $b -gt 10 不成立, 输出false
fi

if [[ $a -lt 10 || $b -gt 10 ]]
then
   echo "返回 true"   # $a -lt 10 成立,  输出true
else
   echo "返回 false"  
fi

运行效果
在这里插入图片描述

6 文件测试运算符

介绍

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

属性检测描述如下:

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d filedirectory, 检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f filefile, 检测文件是否是普通文件(既不是目录,也不是设备文件)
,如果是,则返回 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 fileread,检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w filewrite,检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x fileexecute, 检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s filesize, 检测文件是否为空(文件大小是否大于0)
,不为空返回 true。
[ -s $file ] 返回 true。
-e fileexists, 检测文件(包括目录)是否存在,如果是,
则返回 true。
[ -e $file ] 返回 true。
file1 -nt file2new than(nt), file1是否比file2新[ file1 -nt file2 ]
file1 -ot file2old than(ot), file1是否比file2旧[ file1 -ot file2 ]

其他检查符:

  • -S: 判断某文件是否 socket。
  • -L: link, 检测文件是否存在并且是一个符号链接。

语法

[ options 文件路径字符串][[ options 文件路径字符串 ]]

演示

operation6.sh脚本代码

#!/bin/bash

file="/root/operation1.sh"
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件是普通文件"
else
   echo "文件是特殊文件"
fi
if [ -s $file ]
then
   echo "文件不是空"
else
   echo "文件是空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi
if [ -d $file ]
then
   echo "文件是目录"
else
   echo "文件不是目录"
fi

file2="/root/operation2.sh"
if [ file -nt file2 ]
then
   echo "operation1.sh文件比operation2.sh文件新"
else
   echo "operation1.sh文件不比operation2.sh文件新"
fi

运行效果

在这里插入图片描述

operation1.sh文件不可执行, 因为没有可执行权限

第四篇请阅读:Linux Shell编程入门到实战(四)

在这里插入图片描述在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_sky分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值