条件语句
测试表达式是否成立
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