目录
一、条件判断的两种方式
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/null
if [ $?-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}')
#将取到的值赋给USED
if [ $USED -gt 40 ];then
#为了方便演示,改为40
echo "警告!当前/目录的磁盘使用率超过为$USED%"
fi
6.3 双分支案例3
[root@localhost/data/sh]# vim netstat.sh
#!/bin/bash
netstat -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
fi
fi
6.4 多分支案例4
#!/bin/bash
read -p "请输入你的考试分数:" grade
if [ $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)" num
case $num in
100)
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 浮点运算字符串}’