参考:《shell脚本-菜鸟教程》
1 流程控制语句
1.1 if语句
-
语法1(if)
if condition then command1 command2 ... fi #写成一行 if [condition]; then command; fi ######### 解释 ########### # if 代表判断开始 # # fi 代表整个if语句结束 ######### 结束 ###########
-
语法2(if else)
if condition then command1 command2 ... else command fi
-
语法3(if else-if else)
if condition then command1 elif condition2 then command else command fi #具体等后面学到运算符再细讲
2 运算符
在shell中运算符分为以下几种:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件运算符
注意:
原生的bash是不支持数学运算的,所以我们需要借助其他的命令帮助我们去执行,最常用的就是expr
,这是一款表达式计算工具,可以帮助我们去完成求值操作。例如:
从图中可知 两数相加 运算符中间必须要有空格,否则无法计算
2.1 算数运算符
-
说明
运算符 说明 + 加法 - 减法 * 乘法(注意:*在脚本里面是通配符,所以在使用时需要转义) / 除法 % 取余 = 赋值 == 相等。两个数字进行相比,相等为true,不等false != 不相等 两个数字相比 不等为true,相等为false -
案例
#!/bin/bash a=10; b=20; echo "a + b = $result" # 减法 result=`expr $a - $b`; echo "a - b = $result" # 乘法 result=`expr $a \* $b` echo "a * b = $result" # 除法 result=`expr $a / $b` echo "a / b = $result" # 取余 result=`expr $a % $b` echo "a % b = $result" #赋值 re=$result echo "赋值: $re" #赋值 re=$result echo "赋值: $re" ############# 解释 ################################################################## # # 判断 == 必须用[] 包裹起来 且比较符之间必须要有空格 # 这种写法[$a==$b]是错误的 # 这种写法[ $a== $b ]是正确的 # 这种比较只能放在流程控制语句种,如果把[$a == $b]赋值给一个变量或者输出,得不到想要的结果 # # if和条件之间必须要有 空格 # 当if条件结束时 必须写上fi,代表fi结束 # ###################################################################################### if [ $a == $b ] then echo 'a 等于b' else echo 'a 不等于 b' fi if [ $a != $b ] then echo "a !=b" else echo "a == b" fi
执行结果如下:
image-20200615170111497
2.2 关系运算符
-
简介
关系运算符只支持数字和字符串为纯数字的字符串
运算符 说明 -eq 等于; 两个数比较,相等返回true,不等返回false -ne 不等于;两个数比较 不等返回true ,相等返回false -gt 大于;两个数比较,左边的数据大于右边边的数据 返回true,否则返回false -lt 小于;两个数比较,左边的数大于右边的数返回false,否则返回true -ge 大于等于;两个数比较,左边的数大于或者等于右边的数 返回true,否则返回false -le 小于等于;两个数比较 左边的的小于或者等于右边的数 返回true 否则返回false -
案例
#!/bin/bash a=20 c=10 # -eq等于 if [ $a -eq $c ] then echo 'a -eq c : a 等于 c' else echo "a -eq c : a 不等于 c" fi #-ne 不等于 if [ $a -ne $c ] then echo 'a -ne c : a 不等于 c' else echo "a -ne c : a 等于 c"fi # -gt 大于 if [ $a -gt $c ] then echo "a -gt c: a大于c" else echo "a -gt c: a 小于c" fi # -lt 小于 if [ $a -lt $c ] then echo "a -lt c: a大于c" else echo "a -lt c: a 小于c" fi # -ge 大于等于 if [ $a -ge $c ] then echo "a -ge c: a大于等于c" else echo "a -ge c: a 小于等于 c" fi # -le 小于等于 if [ $a -le $c ] then echo "a -le c: a大于等于c" else echo "a -le c: a 小于等于 c" fi
执行脚本
image-20200615201717370
2.3 逻辑运算符
对布尔结果进行计算
运算符 | 说明 |
---|---|
! | 对布尔结果取反,如果结果为true,取反结果为false |
-a | 与 左右边结果都为true,整个结果为true |
-o | 只要一个结果为true,整个结果为true |
&& | 如果左边结果为false,就不会执行右边,直接整个结果为false |
|| | 如果左边为true,就不会执行右边,直接整个结果为true |
案例
#!/bin/bash
a=13
b=14
# 取反 符号与表达式之间要有空格
if [ ! $a -gt $b ]
then
echo "对 $a -gt $b 结果取反"
fi
#-a 与运算,即使左边结果为false,也会计算右边
if [ $a -lt 20 -a $a != 100 ]
then
echo "-a 与运算"
fi
#-o 或运算 即使左边结果为true也会再去计算右边
if [ $a -lt 20 -o $a -gt $b ]
then
echo "-o 与运算"
fi
#&& 逻辑与运算 如果左边结果为false,整个结果为false,不会再去计算右边,只有当左边结果为true时才会计算右边
# 必须用双中括号包裹起来
if [[ $a -lt $b && $b != 100 ]]
then
echo "逻辑与运算"
fi
#|| 逻辑||运算 如果左边结果为true,整个结果为true,不会再去计算右边,只有当左边结果为false时才会计算右边
# 必须用双中括号包裹起来
if [[ $a -lt $b || $b != 100 ]]
then
echo "逻辑或运算"
fi
结果如下:
image-202006152121553962.4 字符串运算符
对字符串进行逻辑判断。
逻辑表达式 | 说明 |
---|---|
= | 用来比较两个字符串,如果字符串相等返回true,否则返回false |
!= | 用来比较两个字符串,如果不等返回true,相等返回false |
-z | 用来检测字符串长度是否为0,为0返回ture,不为0返回falses |
-n | 用来检测字符串长度,如果长度不为0返回true,否则返回false |
$ | 用来检测字符串是否为空,不为空返回true |
案例
#!/bin/bash
a="lisi"
b=""
c="wangwu"
echo "a 字符串内容为:$a"
echo "b 字符串内容为:$b"
echo "c 字符串内容为:$c"
if [ $c = $a ]
then
echo "a 与 c比较 不等"
else
echo "a 与 c比较 相等"
fi
if [ $a != $c ]
then
echo "a 与 c比较 不等"
else
echo "a 与 c比较 相等"
fi
if [ -z $b ]
then
echo "b 的字符串长度为0"
else
echo "b 的字符串长度不为0"
fi
#要用 双引号包裹起来
if [-n "$c" ]
then
echo "c 的字符串长度不为0"
else
echo "c 的字符串长度为0"
fi
if [ $b ]
then
echo "b字符串内容为空"
else
echo "b的字符串不为空"
fi
结果如下:
image-202006230935365212.5 文件操作符
在linux中,一切皆文件,因此我们可以对进行进行一些逻辑操作
符号 | 说明 |
---|---|
-b | 检测是否为块设备(u盘,硬盘)文件,如果是 返回true,否则返回fals(这个不怎么常用,了解即可) |
-c | 用来检测是否为字符设备(键盘,打印机)文件,如果是返回true,否则返回false(不怎么常用,了解即可) |
-d | 用来检测文件是否为目录,如果是返回true,否则返回false |
-f | 用来检测文件是否为普通文件,如果是返回true,否则返回false |
-r | 用来检测文件是否可读,可读返回true,否则返回false |
-w | 用来检测文件是否可写,可读返回true,否则返回false |
-x | 用来检测文件是否可执行,可执行返回true,否则返回false |
-s | 用来检测文件是否为空,主要是是看文件大小是否为0,是返回true,不是返回false |
-e | 用来检测文件(目录)是否存在,如果存在返回true,不存在返回false |
案例:
#!/bin/bash
path="./test1.sh"
echo "文件地址: $path"
if [ -b $path ]
then
echo "当前文件是块设备文件"
else
echo "当前文件不是块设备文件"
fi
if [ -c $path ]
then
echo "当前文件是块字符设备文件"
else
echo "当前文件不是字符设备文件"
fi
if [ -d $path ]
then
echo "当前文件是目录文件"
else
echo "当前文件不是目录文件"
fi
if [ -f $path ]
then
echo "当前文件是普通文件"
else
echo "当前文件不是普通文件"
fi
if [ -r $path ]
then
echo "当前文件是可读文件"
else
echo "当前文件不是可读文件"
fi
if [ -w $path ]
then
echo "当前文件可写"
else
echo "当前文件不可写"
fi
if [ -x $path ]
then
echo "当前文件是可执行文件"
else
echo "当前文件不是可执行文件"
fi
if [ -s $path ]
then
echo "当前文件是不为空"
else
echo "当前文件为空"
fi
if [ -b $path ]
then
echo "当前文件存在"
else
echo "当前文件不存在"
fi
结果如下:
image-202006231019404563 循环
3.1 for循环
-
语法
for loop in item1 item2 ... do code1... code2... done 或者
-
案例1
#!/bin/bash for loop in 1 5 6 7 8 89 do echo "循环的数据为 $loop" done
结果为:
image-20200623104611442 -
案例2
image-20200623105142489#!/bin/bash arr=(1 7 8 99) for loop in ${arr[@]} do echo "循环的数据为 $loop" done
3.2 while循环
-
语法
while 条件 do code1 code2 ... done
-
案例1
image-20200623105833943#/bin/bash num=1 #需要两个括号把条件包裹起来 while(($num < 5)) do echo "每次循环的数据为:$num" # let 这个是linux自带的一个变量计算的一个命令 let "num++" done
-
案例2
image-20200623110134096#/bin/bash num=0 arr=("lisi" 5 7) #获取数组长度 length=${#arr[@]} while(($num < length )) do echo "每次循环的数据为:${arr[num]}" # let 这个是linux自带的一个变量计算的一个命令 let "num++" done
3.3 死循环
for((;;))
或者
while true
do
code
code
...
done
3.4 跳出循环
-
简介
- break 跳出循环
- continue 跳出本次循环
-
break案例
image-20200623110615921#/bin/bash num=0 arr=("lisi" 5 7) #获取数组长度 length=${#arr[@]} while(($num < length )) do echo "每次循环的数据为:${arr[num]}" break # let 这个是linux自带的一个变量计算的一个命令 let "num++" done
-
continue 案例
image-20200623110805579#/bin/bash num=0 arr=("lisi" 5 7) #获取数组长度 length=${#arr[@]} while(($num < length )) do echo "每次循环的数据为:${arr[num]}" # let 这个是linux自带的一个变量计算的一个命令 let "num++" continue done
网友评论