文章目录
一、条件测试操作
(1)、test命令 (后面测试皆以test为基础)
测试表达式是否成立,若成立返回0,否则返回其他数值
格式1: test 条件表达式
格式2: [ 条件表达式 ] ##中括号两边至少要有1个空格
(2)、文件测试
1| [ 操作符 文件或目录 ]
常用的测试操作符:
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(excute)
(3)、整数值比较
[ 整数1 操作符 整数2 ]
常用的测试操作符:
-eq:等F(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
[root@localhost ~]#who #查看此台主机有多少用户正在登录
root pts/0 2020-12-16 21:36 (192.168.182.1)
[root@localhost ~]#who | wc -l #加上| 符号后使用wc -l命令可以显示登录的用户数
1
[root@localhost ~]#[ $(who | wc -l) -gt 0 ] && echo "too many" #使用“[]”测试语句,当正在登录的用户“-gt”(表示大于) 0时,&&(表示输出) 输出too many ,$(who | wc -l )表示引用()中的变量的结果。
too many #输出结果为too many
[root@localhost ~]#[ $(who | wc -l) -ge 5 ] && echo ">=5" #当登录的用户大于等于5时,输出>=5,否则不输出。
[root@local host ~]#free -m
total used free shared buff/cache available
Mem: 1823 281 1177 9 364 1347
Swap: 4095 0 4095
[root@local host ~]#free -m | grep "Mem:" | awk '{print $4}' #将free -m中的结果中的Mem过滤出来,并打印出第四列的内容,第四列是free的内容
1177
[root@local host ~]#abc=$(free -m | grep "Mem:" | awk '{print $4}') #接着将上面的一段变量赋值给abc,然后就可以直接调用变量名就可以查看变量值了。
[root@local host ~]#echo $abc
1177
[root@local host ~]#[ $abc -lt 1200 ] && echo "当前内存为${abc}MB,请及时清理!" #使用“[]”判断语句,判断内存是否 -lt(表示小于)1200MB,注意,后面的echo输出中的语句在$abc前后需要加上{},因为我们之定义了这一个变量,不加{}就连着后面的MB作为一个整体,就不是一个变量名了。
当前内存为1177MB,请及时清理! #根据上面的判断语句显示出来的结果
[root@local host ~]#free -m | grep "Mem:" | awk '{print $3/$2}' #使用awk进行除法运算,算出使用率。 $3是空闲内存,$2是total总内存
0.154142
补充:浮点运算,即小数点运算,使用 bc 命令
[root@local host ~]#echo "1.1 + 2.2" | bc #使用bc进行浮点型运算,此处+两边可以加空格也可以不加
3.3
[root@local host ~]#echo "1.1 + 2.2" > 12.txt #将算式赋值给12.txt文本
[root@gcc ~]#cat 12.txt
1.1 + 2.2
[root@local host ~]#bc 12.txt #可以直接使用bc运算12.txt的文本中的内容
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
3.3 #该处是运算的结果
^C
(interrupt) Exiting bc.
[root@local host ~]#cat 12.txt | bc #也可以使用cat | bc 运算
3.3
[root@local host ~]#echo $(awk BEGIN'{print 1.1+2.2}') #也可以使用awk BEGIN进行浮点运算
3.3
(4)、字符串测试
1)、常用的格式:
格式一:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:[ -z 字符串 ]
2)、常用的测试操作符:
常用的测试操作符 | 解释 |
---|---|
= | 第一个字符串与第二个字符串内容相同 |
!= | 第一个字符串与第二个字符串内容不同,!号表示相反的意思 |
-z | 检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串 |
-n | 检测字符串是否存在 |
在进行字符串的测试时,用引号将字符串界定起来是一个非常好的习惯。
测试(1):
#定义两个变量
[root@local host ~]# a="hello"
[root@local host ~]# b="world"
#比较两个字符串是不是相等
[root@local host ~]# [ $a = $b ]
# echo $?的返回值为1,表示两个字符串变量不相等
[root@local host ~]# echo $?
1
#比较两个字符串是不是不相等
[root@local host ~]# [ $a != $b ]
# echo $?的返回值为0,表示两个字符串变量是不相等
[root@local host ~]# echo $?
0
测试(2):
[root@local host ~]#read -p "思聪是不是姓王:yes/no" ack #从键盘输入内容为变量赋值,变量名为ack
思聪是不是姓王:yes/noyes
[root@local host ~]#echo $ack
yes
[root@local host ~]#[ $ack = "yes" ] && echo "王思聪" #使用判断语句,使用=表示左右两边相等,然后输出字符串“王思聪”
王思聪
[root@local host ~]#[ $ack != "no" ] && echo "李思聪" #测试操作符!=两边表示不相等,判断师傅不相等,然后输出“李思聪”
李思聪
(5)、逻辑测试
1、基本格式
格式一: [ 表达式1 ] 操作符 [ 表达式2 ] ...
格式二: 命令1 操作符 命令2 ...
2、常用的测试操作符
&&、| | 操作符能够正常存在于[ [ ] ]条件判断结构中,但是如果出现在[ ] 结构中的话,被报错。
例如:
逻辑测试举例:
[root@local host ~]#a=5
[root@local host ~]#[ $a -ne 1 ] && [ $a -lt 8 ] #在两个[]之间可以使用&&
[root@local host ~]#echo $?
0
[root@local host ~]#[ $a -ne 1 && $a -lt 8 ] #而在一个[]之间不可以使用&&
-bash: [: 缺少 `]'
[root@local host ~]#[[ $a -ne 1 && $a -lt 8 ]] #但是改成两个[]就可以使用&&
[root@local host ~]#echo $?
0
[root@local host ~]#[ $a -ne 1 ] -a [ $a -lt 8 ] #在两个[]之间不可以使用 -a
-bash: [: 参数太多
[root@local host ~]#[ $a -ne 1 -a $a -lt 8 ] #-a 只可以在一个[]之间使用
[root@local host ~]#echo $?
0
[root@local host ~]#[ $a -eq 5 ] && echo true || echo fale #使用||判断前面的条件是否成立,成立输出true,不成立输出flase
true
[root@local host ~]#[ $a -ne 5 ] && echo true || echo fale
fale
二、if语句
1、单分支结构
if 条件测试操作 if 已用磁盘>80%
then 命令序列 👉 then 报警
fi fi
#!/bin/bash
#this is my first shell-script
if [ 5 -ne 6 ] #如果5不等于6
then #成立的话
echo "yes" #输出ok
fi #结束
2、多分支结构
if 条件测试操作1
then
命令序列1
elif 条件测试操作2
then
命令序列2
else
命令序列3
fi
举例:判断成绩是否合格
vim b.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" score
if [ $score -ge 85 ] && [ $score -le 100 ]
then
echo "$score 分,优秀!"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then
echo "$score 分,合格!"
else
echo "$score 分,不合格!"
fi
[root@gcc ~]#sh b.sh
请输入你的分数(0-100):90
90 分,优秀!
[root@gcc ~]#sh b.sh
请输入你的分数(0-100):50
50 分,不合格!
[root@gcc ~]#sh b.sh
请输入你的分数(0-100):80
80 分,合格!
三、case语句
1、case语句的结构
case多分支结构
格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
....
*)
默认命令序列
esac
举例:
case 分数 in
85~100)
评为优秀
;;
70~84)
评为合格
;;
....
*)
判为不合格
esac
针对变量额不同取值,分别执行不同的命令序列
这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句指示判断一个变量的不同取值
case行尾必须为单词“in”,每一模式必须以右括号“)”结束。
双分号“;;”表示命令序列的结束。
模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示“或”,如“A|B”.
最后的 " ) " 表示默认模式,其中的相当于通配符。
case语句实操:
判断分数是否及格
[root@gcc ~]#vim socre.sh
[89][0-9]|100) #这边表示的是从80分到100分,两位数的时候需要把十位和个位分开写,[89]表示十位上的8和9,[0-9]表示各位上的0-9,“|”表示或的意思。
echo "$NUM,秀儿"
;; #固定格式
[67][0-9]) #表示从60分到79分
echo "$NUM,soso"
;;
[0-5][0-9]|[0-9]) #表示0到59分 ,“|”前面的表示从00-59,后面的表示0-9.
echo "$NUM,努力"
;;
*) #表示除0-100以外的任何字符
echo "输入有误!"
esac #结束语句
[root@gcc ~]#chmod +x socre.sh
[root@gcc ~]#./socre.sh
请输入你的分数:80
80,秀儿
[root@gcc ~]#./socre.sh
请输入你的分数:60
60,soso
[root@gcc ~]#./socre.sh
请输入你的分数:15
15,努力
[root@gcc ~]#./socre.sh
请输入你的分数:100000
输入有误!