Shell编程之条件语句
目录
一、条件判断的两种方式
1.1 test
1.2 中括号
1.3 文件测试操作符
二、整数值比较
三、字符串比较
四、逻辑测试
五、三元运算符
六、if语句
6.1 案例1
6.2 单分支案例2
6.3 双分支案例3
6.4 多分支案例4
七、case语句
7.1 案例case并行判断
八、总结
8.1 定义一个变量的方法
8.2 浮点数的运算
一、条件判断的两种方式
1.1 test
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
test 命令期望在命令行中找到一个参数,当 shell 没有为变量赋值时,则将该变量视为空。这意味着在处理脚本时,一旦脚本寻找的参数不存在,则 test 将报告该错误。
test [操作符选项] 表达式
1.2 中括号
[ 操作符选项 表达式 ]
[ -f /opt/abc.txt ]
注意[]空格,否则会失败
测试是否成功使用返回值
boole |
true(真) |
false(假) |
使用场景 |
返回码 |
0 |
非0 |
Linux系统 shell脚本 |
1 |
0 |
Java C |
1.3 文件测试操作符
-e |
测试指定的文件或者目录是否存在 |
-f |
测试指定对象是否为文件;指定的文件是否存在 |
-d |
测试指定的对象是否为目录;指定的目录是否存在 |
-r |
测试指定用户是否有读权限 |
-w |
测试当前用户是否有写权限 |
-x |
测试当前用户是否有执行权限 |
-L |
测试文件是否为符号链接(软链接文件) |
二、整数值比较
操作符
-eq |
等于 |
== |
-gt |
大于 |
\> |
-lt |
小于 |
\< |
-ge |
大于等于 |
|
-le |
小于等于 |
|
-ne |
不等于 |
!= |
[ 整数变量1 操作符 整数变量2]
一般是字符表达式,很少用符号表达式,会有问题
三、字符串比较
[ 字符窜1 = 字符窜2 ] 或者 [ 字符窜1 == 字符窜2 ] 判断是否相同
[ 字符窜1 != 字符窜2 ] 判断是否不相同
#
[ -z "字符串" ] -z:判断字符串是否为空;或者指定的变量是否为空值
[ -n “字符串” ] -n:检查是否有字符串存在
注:如果测试的字符串是变量,我们一般加上双引号,防止产生歧义
四、逻辑测试
-a && 且 前后条件都要成立
-o || 或 只需前后条件中一个成立
[ 表达式1 ] && [ 表达式2 ] 等同于 [ 表达式1 -a 表达式2 ] [[ 表达式1 && 表达式2 ]]
[ 表达式1 ] || [ 表达式2 ] 等同于 [ 表达式1 -o 表达式2 ] [[ 表达式1 || 表达式2 ]]
五、三元运算符
#Java c条件表达式?a:b当表达式为真时,取a值;当表达式为假时,取b值#shell[ 表达式 ] && a || b 等价于if双分支[ 表达式 ] && a 等价于if单分支类似if语句
六、if语句
#单分支if[ 表达式 ];then ...fi#双分支if [ 表达式 ];then ...else ...fi
6.1 案例1
[root@localhost/data/sh]# vim ping.sh#!/bin/bash#判断主机是否存活#ping -c 3 -i 0.5 -w 2 $1 &> /dev/null && echo "$1 is online" || echo "$1 is offline"#发三个包,每隔5秒,注释的为三元运算符方法ping -c 3 -i 0.5 -w 2 $1 &> /dev/nullif [ $?-eq 0 ];then echo "$1 is online"else echo "$1 is offline"fi
6.2 单分支案例2
磁盘空间已用大于80%报警
#!/bin/bash#磁盘空间已用大于80%报警 USED=$(df |grep /dev/mapper/centos-root | awk '{print $5}'|awk -F '%' '{print $1}')#将取到的值赋给USEDif [ $USED -gt 40 ];then#为了方便演示,改为40 echo "警告!当前/目录的磁盘使用率超过为$USED%"fi
6.3 双分支案例3
[root@localhost/data/sh]# vim netstat.sh#!/bin/bashnetstat -natp |grep :80 &> /dev/null#查看端口if [ $? -eq 0 ]then echo "网站服务已在运行!"else if rpm -q httpd &> /dev/null #查看软件是否安装 then echo "正在启动httpd服务" systemctl start httpd else echo "正在安装并启动httpd服务" yum install -y httpd &> /dev/null && systemctl start httpd &> /dev/null fifi
6.4 多分支案例4
#!/bin/bashread -p "请输入你的考试分数:" gradeif [ $grade -ge 85 ]&& [ $grade -le 100 ]then echo "你的成绩为$grade" echo "你的成绩为优秀"elif [ $grade -ge 70 ]&&[ $grade -le 84 ]then echo "你的成绩为$grade" echo "你的成绩为良好"elif[ $grade -ge 60 ]&&[ $grade -le 69 ]then echo "你的成绩为$grade" echo "你的成绩为合格" else echo "你的成绩为$grade" echo "你的成绩不合格"fi
七、case语句
if的多分支是逐条判断,相对而言效率会低一些,而case语句,不满足的条件直接跳过,相对执行效率快一些
7.1 案例case并行判断
[root@localhost/data/sh]# vim case.sh#!/bin/bash#判断分数等级read -p "请输入你的分数:(0-100)" numcase $num in100) echo "恭喜你获得$num 分";;[89][0-9])#80-99 echo "优秀!获得$num 分";;[67][0-9])#60-79 echo "获得$num 分继续努力" ;;[0-9] | [1-5][0-9])#0-59 echo "继续努力!获得$num 分";;*) echo "输入有误,请重新输入"esac
八、总结
8.1 定义一个变量的方法
1.read -p 执行时显示提示信息变量名
2.变量名=变量值
export +变量名 生成为全局变量
8.2 浮点数的运算
echo "浮点运算字符串” Ibc
awk 'BEGIN{print 浮点运算字符串}’