在shell脚本中的各种条件结构和流程控制都要进行各种的测试,然后根据测试的结果执行不同的操作,有时也会和if语句结合,来完成测试判断,以减少程序的运行错误。
也就是说,当我们在写一个脚本,里面没有任何的判断,就写了一些很普通的命令,那么在我们运行脚本的时候,当遇到了错误,也会一直的执行下去,这样就导致了我们脚本执行的结果是错误的。 这时候我们就会用到我们的条件测试比较。
那么在执行条件测试中通常会返回 “真”或者“假”就像我们执行一条成功的命令,那么执行完这条命令 我们echo$? 如果它返回的是0 那么就是真的返回的状态是非0那么就是假的 也就是错的。
格式1:test 条件表达式
格式2:【条件表达式】 '注意两端要有空格:
'文件测试
[操作符 文件或目录]
&? 返回0表示条件成立,返回非零值表示条件不成立
&& 逻辑与,"而且"的意思
|| 逻辑或,"或者"的意思
常见的测试操作符 | 解释 |
---|---|
-d | 测试是否为目录(directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(eXcute) |
[root@localhost ~]# touch abc.txt
[root@localhost ~]# test -f a
abc.txt anaconda-ks.cfg
[root@localhost ~]# test -f abc.txt
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -d abc.txt
[root@localhost ~]# echo $?
1
[root@shuai opt]# mkdir abc
[root@shuai opt]# ls
abc first.sh hua.txt shuai02.txt shuai.txt
baksh hu02a.txt rh shuai.sh tom.sh
[root@shuai opt]# [ -d /opt/abc ]
[root@shuai opt]# echo $?
0
[root@shuai opt]# [ -x /opt/abc ]
[root@shuai opt]# echo $?
0
[root@shuai opt]# ll
总用量 28
drwxr-xr-x. 2 root root 6 7月 16 19:55 abc
-rw-r--r--. 1 root root 366 7月 16 19:22 baksh
-rw-r--r--. 1 root root 45 7月 15 14:46 first.sh
-rw-r--r--. 1 root root 41 7月 15 22:07 hu02a.txt
-rw-r--r--. 1 root root 72 7月 15 22:01 hua.txt
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-r--r--. 1 root root 0 7月 15 21:57 shuai02.txt
-rw-r--r--. 1 root root 210 7月 16 09:57 shuai.sh
-rw-r--r--. 1 root root 102 7月 16 09:10 shuai.txt
-rwxr-xr-x. 1 root root 110 7月 15 20:02 tom.sh
echo $? 查询上个步骤是否成立,成立则为0,不成立则为非0值
&& 是而且的含义 表示如果两边的条件都成立,才会正确执行;echo "yes"很明显是正确的
[root@shuai opt]# [ -e /dev/cdrom ] && echo "yes"
yes
[root@shuai opt]# test -e /dev/cdrom && echo "yes"
yes
命令基本格式
[ 整数1 操作符 整数2 ]
操作符 | 解释 |
---|---|
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-gt | 大于(Greater Than) |
-lt | 小于(Lesser Than) |
-le | 小于或等于(Lesser or Equal) |
-ge | 大于或等于(Greater or Equal) |
[root@locaswiftlhost ~]# [ 12 -lt 80 ] && echo "yes"
yes
[root@localhost ~]# [ 80 = 80 ] && echo "yes"
yes
[root@localhost ~]# [ 80 == 80 ] && echo "yes"
yes
[root@localhost ~]# [ 80 -eq 80 ] && echo "yes"
yes
数值比较用eq
[root@localhost ~]# [ 'liu' == 'liu' ] && echo "yes"
yes
[root@localhost ~]# [ 'liu'-eq 'liu' ] && echo "yes"
-bash: [: liu-eq: 期待一元表达式
[root@localhost ~]# [ 'zhangsan' == 'zhang' ] && echo "yes"
##这边是取反成立 本身不成立的可以取反就行
[root@localhost ~]# [ ! 'zhangsan' == 'zhang' ] && echo "yes"
yes
命令前面加括号或者反撇
bash: [3: 未找到命令...
[root@localhost ~]# [ $(who|wc -l) -lt 5 ] && echo "Too many."
Too many.
查看内存信息
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 3771 216 3249 12 305 3271
Swap: 0 0 0
[root@localhost ~]# free -m | grep "Mem:"
Mem: 3771 217 3248 12 305 3270
[root@localhost ~]# free -m | grep "Mem:" | awk '{print $4}'
3161
[root@localhost ~]# shuai=$(free -m | grep "Mem:" | awk '{print $4}')
[root@localhost ~]# [ $shuai -gt 1000 ]&& echo "$shuai MB"
3160 MB
[root@localhost ~]# [ $shuai -gt 1000 ]&& echo "$shuai"MB
3160MB
[root@localhost ~]# [ $shuai -gt 1000 ]&& echo ${
shuai}MB
3160MB '$跟大括号表示一个变量'
1.41:字符串比较
常用的格式
格式一:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式二:[ -z 字符串 ]
常用的测试操作符 | 解释 |
---|---|
= | 第一个字符串与第二个字符串内容相同 |
!= | 第一个字符串与第二个字符串内容不同,!号表示相反的意思 |
-z | 检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串 |
'两个字符串不相等'
[root@localhost ~]# [ $LANG != "EN" ]&&echo "no"
no
[root@localhost ~]# [ -z '' ]&&echo "yes"
yes
[root@localhost ~]# [ -z ' ' ]&&echo "yes"
[root@localhost ~]# [ -z "" ]&&echo "yes"
yes
[root@shuai opt]# [ "帅哥" = "帅哥" ]&& echo "yes"
yes
[root@shuai opt]# [ "帅哥" = "靓男" ]&& echo "yes"
[root@shuai opt]# [ "帅哥" != "靓男" ]&& echo "yes"
yes
[root@shuai opt]# vim test.sh
#!/bin/bash
read -p "是否覆盖" xiaokeai
[ $xiaokeai = "yes" ]&&echo "覆盖"
~
[root@shuai opt]# ./test.sh
是否覆盖yes
覆盖
[root@shuai opt]# ./test.sh
是否覆盖no
#
[root@shuai opt]# vim tom.sh
#!/bin/bash
read -p "是否创建opt/lisi目录(是/否)" ack
[ $ack = 是 ]&& mkdir /opt/lisi
echo "搞定"
[root@shuai opt]# sh tom.sh
是否创建opt/lisi目录(是/否)是
搞定
[root@shuai opt]# ls
baksh first.sh hu02a.txt lisi rh test.sh tom.sh
[root@shuai opt]# vim dd.sh
#!/bin/bash
read -p "是否创建opt/mone目录:(是/否)" shuai
[ -d /opt/mone ]&& echo "/opt/mone" || mkdir /opt/mone && echo "创建完成"
[root@shuai opt]# sh dd.sh
是否创建opt/mone目录:(是/否)是
/opt/mone
创建完成
基本格式
格式一: [ 表达式1 ] 操作符 [ 表达式2 ] ...
格式二: 命令1 操作符 命令2 ...
常用的测试操作符 | 解释 |
---|---|
&& | 逻辑与,“而且”的意思,使用test命令测试时,可将“&&”改为“-a” |
|| | 逻辑或,“或者”的意思,使用test命令测试时,可将“||”改为“-o” |
! | 逻辑否 |
示例:
[root@localhost ~]# [ -d /etc ] && [ -r/etc ] && echo "Yes"
Yes
##两个有一个成立就行
[root@localhost ~]# [ -d /etc ] || [ -r/etc ] && echo "Yes"
Yes
[root@localhost ~]# [ -f /etc ] || [ -r/etc ] && echo "Yes"
Yes
单分支结构(基本格式)
if 条件测试操作
then 命令序列
fi
单分支结构(举例)
if 磁盘已用空间>70%
then 报警
fi
单分之针对成立
exit 1异常退出
exit 0正常退出
[root@shuai opt]# vim xx.sh
#!/bin/bash
read -p "请输入目录位置:" TT
if [ ! -d $TT ]
then
mkdir -p $TT
echo "$TT创建完成"
fi
请输入目录位置:/opt/niu
/opt/niu创建完成
[root@shuai opt]# ls '已经生成niu目录'
baksh first.sh lisi niu test.sh xx.sh
dd.sh hu02a.txt mone rh tom.sh
双分支结构(基本格式)
if 条件测试操作
then 命令序列1
else 命令序列2
fi
双分支结构(举例)
if 80端口是否在监听
then 网站服务已在运行
else 启动httpd服务
fi
实例:
[root@localhost ~]# vim pinghost.sh
#!/bin/bash
read -p "请输入IP地址:" shuai
ping -c 3 -i 0.2 -W 3 $shuai &>/dev/null
if [ $? -eq 0 ]
then
echo "Host $shuai is up."
else
echo "Host $shuai IS down."
fi
[root@localhost ~]# sh pinghost.sh
请输入IP地址:8.8.8.8
Host IS down.
#-c:发送包 -i:发送间隔 -W:等待时间
[root@shuai opt]# vim ss.sh
#!bin/bash
read -p "请输入目录位置:" TT
if [ -d $TT ]
then
echo "目录已存在"
else
mkdir -p $TT
fi
[root@shuai opt]# sh ss.sh
请输入目录位置:/opt/rid
多分支结构(基本格式)
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
多分支结构(举例)
if 分数为85~100之间
then 判为优秀
elif 分数为70~84之间
then 判为合格
else
判为不合格
fi
举例:判断分数范围,分数优秀,合格,不合格三挡
[root@localhost opt]# vim gg.sh
#!/bin/bash
read -p "请输入成绩:" score
if [ $score -lt 0 ] || [ $score -gt 100 ]
then
echo "输入有误"
exit 1;
elif [ $score -ge 85 ] && [ $score -le 100 ]
then
echo "成绩优秀"
elif [ $score -ge 70 ] && [ $score -le 84 ]
then
echo "成绩合格"
else
echo "成绩不合格"
fi
[root@localhost opt]# ./gg.sh
请输入成绩:95
成绩优秀
[root@localhost opt]# ./gg.sh
请输入成绩:83
成绩合格
[root@localhost opt]# ./gg.sh
请输入成绩:53
成绩不合格
[root@localhost opt]# ./gg.sh
请输入成绩:110
输入有误
[root@localhost opt]# ./gg.sh
请输入成绩:-56
输入有误
[root@shuai opt]# vim gg
#!/bin/bash
read -p "请问你一天睡了几小时:" sleep
if [ $sleep -ge 0 ] && [ $sleep -le 24 ]
then
if [ $sleep -ge 6 ] && [ $sleep -le 8 ]
then
echo "睡眠质量很好"
elif [ $sleep -ge 1 ] && [ $sleep -le 5 ]
then
echo "容易得糖尿病、高血压,要改善睡眠质量"
else
echo "姐们睡太多啦"
fi
else
echo "请输入(0-24)区间值 "
fi
~
[root@shuai opt]# sh gg
请问你一天睡了几小时:1
容易得糖尿病、高血压,要改善睡眠质量
[root@shuai opt]# sh gg
请问你一天睡了几小时:9
姐们睡太多啦
[root@shuai opt]# sh gg
请问你一天睡了几小时:8
睡眠质量很好
##这边娱乐一下 不喜勿喷
case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。
case $变量名 in
"值 1")
;;
如果变量的值等于值1,则执行程序1,值
2")
如果变量的值等于值2,则执行程序2
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#男子组跟女子组百米跑步10秒以内
[root@shuai opt]# vim baksh
#!/bin/bash
read -p "请输入性别: " sex
read -p "请输入成绩: " score
case $sex in
男)
case $score in
[1-9]|10)
echo "你进入男子组"
;;
*)
echo "你没有进入男子组"
esac
;;
女)
case $score in
[1-9]|10)
echo "你进入女子组"
;;
*)
echo "你没有进入女子组"
esac
;;
*)
echo "你输入的性别错误"
esac
[root@shuai opt]# sh baksh
请输入性别: 男
请输入成绩: 3
你进入男子组
[root@shuai opt]# sh baksh
请输入性别: 女
请输入成绩: 10
你进入女子组
[root@shuai opt]# sh baksh
请输入性别: 男
请输入成绩: 23
你没有进入男子组
以上就是本文的全部内容,希望对大家的学习有所帮助