天下之事常成于困约,而败于奢靡。这篇文章主要讲述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、属性测试补充:
-sFILE #是否存在非空
-tfd#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 字符串 ]
常用的测试操作符:
=:字符串内容相同
!=: 字符串内容不同,!表示相反的意思
【shell编程之条件语句】-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/bashping -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
推荐阅读
- #yyds干货盘点#netty系列之:一个价值上亿的网站速度优化方案
- 技术分享| Linux高并发踩过的坑及性能优化
- #yyds干货盘点#30个类手写Spring核心原理之AOP代码织入
- 算法 | 第4章 树与图相关《程序员面试金典》#yyds干货盘点#
- #yyds干货盘点# animation-delay负值妙用,你不来了解一下吗
- #聊一聊WuKong编辑器#51CTO更文一个月,体验悟空编辑器的那些事儿
- #yyds干货盘点# MySQL性能优化(深入理解索引的这点事)
- SqlServer-逻辑查询-ON与WHERE天壤之别
- #yyds干货盘点#iOS 15 中的前端开发快捷方式