Shell编程之条件语句(文件测试,整数测试,字符串比较+if语句详+case语句详解)

前言

在shell脚本中的各种条件结构和流程控制都要进行各种的测试,然后根据测试的结果执行不同的操作,有时也会和if语句结合,来完成测试判断,以减少程序的运行错误。

也就是说,当我们在写一个脚本,里面没有任何的判断,就写了一些很普通的命令,那么在我们运行脚本的时候,当遇到了错误,也会一直的执行下去,这样就导致了我们脚本执行的结果是错误的。 这时候我们就会用到我们的条件测试比较。

那么在执行条件测试中通常会返回 “真”或者“假”就像我们执行一条成功的命令,那么执行完这条命令 我们echo$? 如果它返回的是0 那么就是真的返回的状态是非0那么就是假的 也就是错的。

一:条件测试

1.1:test命令

  • 测试表达式是否成立,若成立返回0,否则返回其他数值
格式1:test  条件表达式
格式2:【条件表达式】             '注意两端要有空格:
'文件测试

1.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 716 19:55 abc
-rw-r--r--. 1 root root 366 716 19:22 baksh
-rw-r--r--. 1 root root  45 715 14:46 first.sh
-rw-r--r--. 1 root root  41 715 22:07 hu02a.txt
-rw-r--r--. 1 root root  72 715 22:01 hua.txt
drwxr-xr-x. 2 root root   6 1031 2018 rh
-rw-r--r--. 1 root root   0 715 21:57 shuai02.txt
-rw-r--r--. 1 root root 210 716 09:57 shuai.sh
-rw-r--r--. 1 root root 102 716 09:10 shuai.txt
-rwxr-xr-x. 1 root root 110 715 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.3:整数值比较

  • 整数值比较
命令基本格式
[ 整数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.4:字符串比较

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.5:逻辑测试

基本格式
格式一: [ 表达式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语句的结构

2.1:单分支结构

单分支结构(基本格式)
if 条件测试操作
	then  命令序列
fi
单分支结构(举例)
if 磁盘已用空间>70%
	then  报警
fi

mark

单分之针对成立

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

2.2:双分支结构

双分支结构(基本格式)
if 条件测试操作
	then  命令序列1
	else  命令序列2
fi
双分支结构(举例)
if 80端口是否在监听
	then  网站服务已在运行
	else  启动httpd服务
fi

mark

实例:

[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

2.3:多分支结构

多分支结构(基本格式)
if 条件测试操作1
	then  命令序列1
elif  条件测试操作2
	then  命令序列2
else
	命令序列3
fi
多分支结构(举例)
if 分数为85~100之间
	then  判为优秀
elif  分数为70~84之间
	then  判为合格
else
	判为不合格
fi

mark

举例:判断分数范围,分数优秀,合格,不合格三挡
[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语句

case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。

mark

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
你没有进入男子组

以上就是本文的全部内容,希望对大家的学习有所帮助

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/107402259