shell编程之条件语句

Posted kiroct

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell编程之条件语句相关的知识,希望对你有一定的参考价值。

条件语句

测试表达式是否成立

test  命令          ;格式1
[ 条件表达式 ]       ;格式2

如果成功返回0,如果失败则返回其他数值

格式1:test  操作符  表达式
举例: test -d /etc/sysconfig  ;测试是否为目录
     echo $?
     0                       ;(返回值)  

文件测试:

[ 操作符 文件或者目录 ]

举例: [ 操作符号 条件表达式 ]
      [ -d /etc/sysconfig ]
      echo  $?
      0                       ;(返回值) 0表示这个的确是目录

1、常用的测试操作符:

-d ;测试是否为目录

-e:测试目录或者文件是否存在(首选用-e)

-a:测试目录或者文件是否存在(不建议使用-a)

-f:测试对象是否为文件(同样可以判断这个文件是否存在

-r:测试当前用户是否有权限去读取

-w:测试当前用户是否有权限去写入

-x:测试当前用户是否有权限去执行

-L:测试是否为软连接文件

2、属性测试补充:

-s FILE #是否存在非空

-t fd #fd 文件描述是否在某终端已经打开过

-N FILE #文件自从上一次被读取后是否被人修改过

-O FILE #当前有效用户是否为文件属主

-G FILE #当前有效用户是否为文件属组


整数值比较

[ 整数1 操作符 整数2 ]

举例:
1、[ 1 -eq 1 ]
   echo $?
   0 (返回值)

2、[ 1 -lt 2 ]
   echo $?
   0 (返回值)

3、[ 10 -gt 20 ]
   echo $?
   1 (返回值)

!!常用的测试操作符

-eq :等于         或者   ==

-ne :不等于       或者   !=

-gt :大于        或者    \\>

-lt :小于        或者    \\<

-le :小于或者等于

-ge :大于或者等于

举例:

计算内存已使用情况
used=$(free | grep "Mem:" | awk print $3)      ;已使用量
total=$(free | grep "Mem:" | awk print $2)     ;总计用量
used_pre=$(echo "scale=2;$used/$total*100"|bc|awk -F. print $1)     ;计算占用率
[ $used_pre -gt 25 ] && echo "使用率过高,当前使用率为:$used_pre"  ;判断内存使用情况并发出报警

字符串比较:

格式1:

[ 字符串1  = 字符串2  ]

[ 字符串1 != 字符串2 ]

格式2:

[ -z 字符串 ]

常用的测试操作符:

= :字符串内容相同

!= : 字符串内容不同,!表示相反的意思

-z : 字符串内容是否为空,对于未定义或者赋予空值的变量将视为空串

拓展:

[ -n 字符串 ] : 判断字符串是否存在,与-z正好相反。记得使用""直接引用才行哦


逻辑测试

格式1: [表达式1]  操作符  [表达式2]        :通常用&&  ||

格式2: [ 命令1 操作符 命令2 ]             :通常用-a  -o

常见条件:

1、逻辑且(表示为"而且")

-a  或者 && 

2、逻辑或(表示为"或者")

-o 或者 ||

3、逻辑否定

拓展:

1、逻辑且,是左边先成立,才会继续执行右边 xxx && bbb

2、逻辑或,是左边如果不成立,则执行右边命令(如果左边成立了,那么右边就不再会继续执行了) xxx || bbb

#!/bin/bash
#使用三元运算符来写ping主机的脚本
ping -c 3 -i 0.5 -w 2 $1 &>/dev/null && echo "$1 在线" || echo "$1 不在线"

if语句

1、单分支结构

if    条件测试操作
then  命令序列
fi    ;标准格式结尾

2、双分支结构

if    条件测试操作
then  命令序列1
else  命令序列2
fi    ;标准格式结尾

3、多分支

if     判断条件1
then   条件1为真的代码
elif   判断条件2
then   条件2为真的代码
......
else   其他所有结果,当上面的判断都失败后采用(else可选:可加或者不加)
fi     ;标准格式结尾

case语句结构

case支持glob风格的通配符

*任意长度任意字符

?任意单个字符

[0-9]指定范围内的任意单个字符

|  ;或者      
举例:  a|b a或者b

1、case多分支结构

case  变量值  in
模式1)
分支1
;;
模式2)
分支2
;;
......
*)
 默认命令,以上分支都除外的情况下采用  {此外, "*)"不是必须的,可有可无的选项 }
esac

拓展练习

1、if的条件语句来ping主机是否在线

#!/bin/bash

ping -c 3 -i 0.5 -w 2 $1 &>/dev/null
#ping位置参数$1,发送三个包,间隔0.5秒,设置2秒的超时,所有导出结果丢进黑洞

if [ $? -eq 0 ]
then
 echo "$1 在线"
else
echo "$1 不在线"
fi
#通过判断$?返回的结果值来确定ping的主机在不在线,0为正确在线,返回1就会else不在线

2、查询httpd服务是否开启

#!/bin/bash
netstat -napt | grep :80 &>/dev/null
#查询80端口是否开启,并把输出结果丢进黑洞

if [ $? -eq 0 ]
then 
 echo "httpd服务已经运行"
else
 rpm -q httpd &> /dev/null
 if [ $? -eq 0 ]
then
 echo "httpd服务已经安装,准备开启服务"
 systemctl start httpd
else
 echo "正在安装httpd服务,并准备启动改服务"
 df | grep "/dev/sr0" &> /dev/null
 if [ $? -eq 0 ]
then
 yum install -y httpd &> /dev/null
 sysytemctl start httpd 
else
 mount /dev/cdrom /mnt &> /dev/null
 yum install -y httpd &> /dev/null
 sysytemctl start httpd 
 fi
fi
fi

以上是关于shell编程之条件语句的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之条件语句——if语句case语句

if语句 条件测试 shell编程之条件语句

Shell编程之条件语句

shell if 语句

Shell编程Shell中的流程控制之if语句

shell编程之条件语句