Shell编程之条件语句

一、条件测试操作

1、test命令

测试表达式是否成立,若成立返回0,否则返回其他数值

格式1: test 条件表达式
格式2: [ 条件表达式 ]

用例演示:

[root@localhost ~]# test a=a
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1=1; echo $?
0
[root@localhost ~]# test 1 = 2 
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ 1 = 1 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ 1 = 2 ]
[root@localhost ~]# echo $?
1

 2、文件测试

格式:[ 操作符 文件或目录 ]

常用的操作符:
-e:测试目录或文件是否存在(Exist)
-d:测试是否为目录(Directory)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试是否设置有可执行(Excute)权限
-L:测试是否为符号链接

用例演示:

[root@localhost ~]# mkdir test
[root@localhost ~]# ls
anaconda-ks.cfg  original-ks.cfg  test  公共  模板  视频  图片  文档  下载  音乐  桌面
[root@localhost ~]# [ -e test ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -f test ]            //测试是否为文件
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d test ]            //测试是否为目录
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -w test           //测试当前用户是否有权限写入
[root@localhost ~]# echo $?
0
[root@localhost ~]# useradd zhangsan        //添加张三用户
[root@localhost ~]# su zhangsan             
[zhangsan@localhost root]$ test -w test     //测试当前用户是否有权限写入  
[zhangsan@localhost root]$ echo $?
1

3、整数值的比较

格式:[ 整数变量1 操作符 整数变量2 ]

-eq等于
-gt大于
-lt小于
-ge大于等于
-le小于等于
-ne不等于

 用例演示:

[root@localhost ~]# test 100 -eq 100
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 100 -eq 200 ; echo $?
1
[root@localhost ~]# test 100 -ne 200 ; echo $?
0
[root@localhost ~]# test 100 -le 200 ; echo $?
0
[root@localhost ~]# test 100 -ge 200 ; echo $?
1


[root@localhost ~]# [[ 99+1 -eq 100 ]] ; echo $?
0
[root@localhost ~]# ((99+1==100)) ; echo $?
0
[root@localhost ~]# ((99+1!=100)) ; echo $?
1
[root@localhost ~]# ((99+1!=100)) ; echo $?
1
[root@localhost ~]# [ 99 -ne 100 ] ; echo $?
0

4、字符串的比较

=字符串内容相同
!=字符串内容不同
-z字符串内容为空
-n 字符是否存在

用例演示

[root@localhost ~]# a=abc
[root@localhost ~]# echo $a
abc
[root@localhost ~]# b=ab
[root@localhost ~]# echo $b
ab
[root@localhost ~]# [ -z $a ] ; echo $?       //判断a是否为空
1
[root@localhost ~]# [ -z $b ] ; echo $?       //判断b是否为空
1
[root@localhost ~]# [ -n $b ] ; echo $?       //判断b是否存在 
0
[root@localhost ~]# [ -n $a ] ; echo $?       //判断a是否存在 
0
[root@localhost ~]# [ -n "$c" ] ; echo $?     
1
[root@localhost ~]# [[ $a = ~$b ]] ; echo $?  
1

5、逻辑测试

格式1: [ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2: 命令1 操作符 命令2 ...

1、[ 表达式1 ] && [ 表达式2 ]   [ 表达式1 -a 表达式2 ]    [[ 表达式1 && 表达式2 ]]       且,要求前后表达式条件都成立
2、[ 表达式1 ] || [ 表达式2 ]   [ 表达式1 -o 表达式2 ]    [[ 表达式1 || 表达式2 ]]                或,只需前后表达式条件成立一个即可

3、[ 表达式1 ] || 命令1              #如果表达式1条件成立不会执行或运算符后面的命令1,如果表达式1条件不成立则会执行或运算符后面的命令1
4、[ 表达式1 ] && 命令1 || 命令2     #如果表达式1条件成立则执行命令1,如果表达式1条件不成立则命令2

5、[ ! 表达式1 ]       #取反,如果表达式1条件成立则最终结果为条件不成立

用例演示1: 

[root@localhost ~]# a=100
[root@localhost ~]# echo $a
100
[root@localhost ~]# [ $a -gt 99 ] && [ $a -eq 100 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $a -gt 99 ] && [ $a -ne 100 ]; echo $?
1
[root@localhost ~]# [ $a -gt 99 ] || [ $a -eq 100 ]; echo $?
0
[root@localhost ~]# [ $a -gt 999 ] || [ $a -eq 100 ]; echo $?
0
[root@localhost ~]# [ $a -gt 999 ] || [ $a -eq 10 ]; echo $?
1
[root@localhost ~]# [ $a -gt 99 -a $a -ne 100] ; echo $?
bash: [: 缺少 `]'
2
[root@localhost ~]# [ $a -gt 99 -a $a -ne 100 ] ; echo $?
1
[root@localhost ~]# [ $a -gt 99 ] && echo true || echo false  //三元表达式
true
[root@localhost ~]# [ $a -lt 99 ] && echo true || echo false
false

用例演示2: 查看是否能ping通,ping通返回true,否则返回false

[root@localhost ~]# vim ping.sh
[root@localhost ~]# chmod +x ping.sh         //赋予可执行权限
[root@localhost ~]# vim ping.sh
[root@localhost ~]# ./ping.sh 192.168.109
192.168.109 is offline
[root@localhost ~]# ./ping.sh 192.168.108
192.168.108 is offline

用例三:

通过端口判断httpd进程是否启动,启动则输出httpd已启动,否则启动httpd 

[root@localhost ~]# ss -lntp | grep :80 &> /dev/null && echo 'httpd is starting' || systemctl start httpd
[root@localhost ~]# httpd is starting

判断进程是否正在运行的方法:

  1. systemctl status 进程服务
  2. netstat -lntup | grep :端口/进程名
  3. ss -lntup | grep :端口/进程名
  4. lsof -i :端口
  5. ps -elf | grep 进程名 | grep -v "grep" | grep -v "$$" | wc -l
  6. pidof 进程名 | wc -w
  7. killall -0 进程名

二、if分支结构       

单分支结构

用例:在系统磁盘使用率达到80%以上时,发出警报

思路:

 创建脚本并写入命令,具体操作如下:

[root@localhost opt]# mkdir demo
[root@localhost opt]# cd demo/
[root@localhost demo]# vim demo.sh
[root@localhost demo]# chmod +x demo.sh
[root@localhost demo]# ./demo.sh

双分支结构 

 格式:

  if  [判断条件] ;  then  

         条件成立的分支代码

 else

            条件不成立的分支代码  

   fi

用例:判断httpd服务是否运行,若不运行,则启动httpd

多分支结构 

if  [判断条件] ;  then  

         条件成立的分支代码

elif [ 判断条件];then 

         条件成立后的代码 

 else

            条件不成立的分支代码  

   fi

示例:

[root@localhost ~]# vim demo1.sh
[root@localhost ~]# chmod +x demo1.sh
[root@localhost ~]# ./demo1.sh
请输入你的考试分数:99
不错

示例2: 判断输入的数字是否为整数,若是整数,判断是奇数还是偶数

三、case语句

case多分支语句的语法:
case $变量 in
模式1)
  命令序列
  ;;
模式2)
  命令序列
  ;;
....
*)
  命令序列
esac
 

示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值