内容预知
1.条件测试的语法
在shell脚本中进行条件判断的两种通式:
方式一: test [操作符选项] 表达式
方式二: [ 操作符选项 表达式 ] 两边要有空格
在Java中有boolean值来帮助我们识别逻辑判断条件的真假,在shell脚本中通过特俗变量$?同样能够达到判断上一命令执行的状态是否成功(返回码 0 为执行成功!非0则为执行异常! )
| -e | 测试 指定的文件或者目录是否存在 |
| -f | 测试 指定的对象是否为文件;指定的文件是否存在 |
| -d | 测试 指定的对象是否为目录;指定的目录是否存在 |
| -r | 测试 当前用户是否有读权限 |
| -w | 测试 当前用户是否有写权限 |
| -x | 测试 当前用户是否有执行权限 |
| -L | 测试文件是否为符号链接(软链接文件) |
运用演示:
- [root@localhost ~]#mkdir -p /test
- [root@localhost ~]#cd /test
- [root@localhost test]#mkdir test1
- [root@localhost test]#test -e /test/test1
- [root@localhost test]#echo $?
- 0
- [root@localhost test]#touch /test/test1.txt
- [root@localhost test]#[ -f /test/test1 ]
- [root@localhost test]#echo $?
- 1
- [root@localhost test]#[ -f /test/test1.txt ]
- [root@localhost test]#echo $?
- 0
- [root@localhost test]#[ -x /test/test1.txt ]
- [root@localhost test]#echo $?
- 1
- [root@localhost test]#chmod +x /test/test1.txt
- [root@localhost test]#ll test.1
- ls: 无法访问test.1: 没有那个文件或目录
- [root@localhost test]#ll test1.txt
- -rwxr-xr-x. 1 root root 0 8月 24 20:10 test1.txt
- [root@localhost test]#[ -x /test/test1.txt ]
- [root@localhost test]#echo $?
- 0
- [root@localhost test]#echo $?

该测试总结: 运用文件测试符到测试通式子,结合$?的返回值,可以准确且快速的得出我们想要的文件属性结果和是否存在。当然在命令环境下,显得没有什么作用,但是在脚本环境,可以作为很多判断条件和执行条件
操作符:
| -eq | 等于 |
| -gt | 大于 |
| -lt | 小于 |
| -ge | 大于等于 |
| -le | 小于等于 |
| -ne | 不等于 |
运用演示:
- [root@localhost test]#test 1 -eq 1
- [root@localhost test]#echo $?
- 0
- [root@localhost test]#[ 2 -lt 3 ]
- [root@localhost test]#echo $?
- 0
- [root@localhost test]#[ 2 -lt 1 ]
- [root@localhost test]#echo $?
- 1
- [root@localhost test]#[ 2 -le 3 ]
- [root@localhost test]#echo $?
- 0
- [root@localhost test]#[ 2 -gt 3 ]
- [root@localhost test]#echo $?
- 1
- [root@localhost test]#[ 4 -ge 3 ]
- [root@localhost test]#echo $?
- 0
- [root@localhost test]#[ 4 -ne 3 ]
- [root@localhost test]#echo $?
- 0

该测试总结:运算符在if条件中,起到了判断左右边值关系的作用。根据关系分析相对应的结果
| = | 字符串内容相同 |
| != | 字符串内容不同,! 号表示相反的意思 |
| -z | 字符串内容为空 |
| -n | 字符是否存在 |
运用演示:
- [root@localhost ~]#yang=1
- [root@localhost ~]#wang=abc
- [root@localhost ~]#liu=1
- [root@localhost ~]#[ $yang = $liu ]; echo $?
- 0
- [root@localhost ~]#[ $yang = $wang ]; echo $?
- 1
- [root@localhost ~]#[ $yang != $liu ]; echo $?
- 1
- [root@localhost ~]#[ -z $yang ]; echo $?
- 1
- [root@localhost ~]#[ -n $yang ]; echo $?
- 0
- [root@localhost ~]#[ -z "$yang" ]; echo $?
- 1
- [root@localhost ~]#[ -n $"yang" ]; echo $?
- 0

方式一 : echo "浮点运算字符串" | bc
方式二: awk 'BEGIN {print 浮点运算字符串}'
- [root@localhost ~]#i=1.1*1.2
- [root@localhost ~]#awk 'BEGIN {print '$i'}'
- 1.32
- [root@localhost ~]#echo "$i"|bc
- 1.3
- [root@localhost ~]#echo "scale=2; $i"|bc
- 1.32
[ 表达式1 ] && [ 表达式2 ] 等同于 [ 表达式1 -a 表达式2 ] [[ 表达式1 && 表达式2 ]]
[ 表达式1 ] || [ 表达式2 ] 等同于 [ 表达式1 -o 表达式2 ] [[ 表达式1 || 表达式2 ]]
- [root@localhost ~]#[ 1 -eq 2 ] || [ 1 -eq 1 ]
- [root@localhost ~]#echo $?
- 0
- [root@localhost ~]#[ 1 -eq 2 ] && [ 1 -eq 1 ]
- [root@localhost ~]#echo $?
- 1
- [root@localhost ~]#[ 1 -eq 2 -o 1 -eq 1 ]
- [root@localhost ~]#echo $?
- 0
- [root@localhost ~]#[[ 1 -eq 2 || 1 -eq 1 ]]
- [root@localhost ~]#echo $?
- 0
- [root@localhost ~]#[ 1 -eq 2 -a 1 -eq 1 ]
- [root@localhost ~]#echo $?
- 1
- [root@localhost ~]#[[ 1 -eq 2 && 1 -eq 1 ]]
- [root@localhost ~]#echo $?
- 1
- [root@localhost ~]#[ 1 -eq 2 ] && echo true || echo false
- false
- [root@localhost ~]#[ 1 -eq 1 ] && echo true || echo false
- true
- [root@localhost ~]#[ 1 -lt 1 ] && echo true || echo false
- false

2. if的条件语句的语法
格式:
if [判断条件] ; then
条件成立的分支代码
fi
运用演示:
需求:写一个能够启动就能监视/boot目录空闲率的脚本,并且当空闲率达到百分之八十时就能够发出报警提示
- vim free.sh
-
- #!/bin/bash
- i=$( df |grep /boot|awk '{print $5}'|awk -F% '{print $1}')
- free_disk=$[100-$i]
- if [ $free_disk -le 96 ]
- then echo "/boot目录的空闲率不足百分之八十,当前空闲率为$free_disk%"
- fi

结果输出:
bash free.sh

格式:
if [判断条件] ; then
条件成立的分支代码
else
条件不成立的分支代码
fi
运用演示:
需求:写一个判断当前目录下中是否存在一个test.sh的文件
- #!#/bin/bash
-
-
- #判断test文件是否存在
- [ -e /root/test.sh ] &>/dev/null
- if [ $? -eq 0 ];then
- echo "test.sh 文件是存在的!"
- else
- echo "tesh.sh 文件并不存在!"
- fi
- ~
结果:

格式:
if [判断条件] ; then
条件成立的分支代码
elif [ 判断条件];then
条件成立后的代码
else
条件不成立的分支代码
fi

运用演示:
需求:写一个分析不同阶段分数应该得到不同评价的shell脚本
- #!/bin/bash
-
- read -p "请输入你本次的成绩:" score
-
- if [ $score -eq 100 ];then
- echo "优秀!"
- elif [ $score -le 99 ] && [ $score -ge 80 ] ;then
- echo "良好!"
- elif [ $score -le 79 ] && [ $score -ge 60 ] ;then
- echo "及格!"
- elif [ $score -le 59 ] && [ $score -ge 0 ] ;then
- echo "继续努力!"
- else
- echo "输入有误!请输出0-100的分数值!"
- fi

结果:

3. case语句
格式:
case 变量引用 in
模式1)
命令分支1
;; 模式2)
命令分支2
;;
...
*)
默认命令分支
esac
| * | 任意长度任意字符 |
| ? | 任意单个字符 |
| [0-9] | 指定范围内的任意单个字符 |
| | | “或者” |
运用演示:
if多分支中实现不同成绩不同评价的案例
- #!/bin/bash
-
- read -p "请输入你的分数(0~100):" num
-
- case $num in
- 100)
- echo "优秀"
- ;;
-
- [89][0-9])
- echo "良好"
- ;;
-
- [67][0-9])
- echo "及格"
- ;;
-
-
- [0-9]|[1-5][0-9])
- echo "继续努力!"
- ;;
-
- *)
- echo "输入有误,请输入 0~100 的范围!"

结果测试:
总结
1. 引用变量字符串时,给变量加上引号,避免引起歧义
2.awk 进行浮点运算时,被赋值的变量,应用用单引号
3. 多条件需要不同结果时,可以运用多分支if来解决。
4.合理利用if语句,嵌套过多的if语句,影响代码运行的速率。
5.注意代码的格式,便于维护和优化