目的:shell 环境会根据执行命令返回后状态值($?)来判断条件是否执行成功(返回值为0 表示成功;返回值为非0 值表示失败或异常)
(一)、文件测试
选项 | 作用 |
---|---|
-d | 测试是否为目录(Directory) |
-f | 测试是否为文件(File) |
-e | 测试目录或文件是否存在(Exist) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户和是否有权限执行(Excute) |
通过条件测试操作返回的预定义变量"$?"的状态值,从而判断条件是否成立。
[root@localhost ~]# [ -d /media/cdrom ] 判断/media/cdrom是否是一个目录
[root@localhost ~]# echo $? 查看是否成立
0 返回0表示条件成立
[root@localhost ~]# [ -f /media/cdrom ] 判断/media/cdrom是否是一个文件
[root@localhost ~]# echo $? 查看是否成立
1 返回1表示条件不成立
(二)、逻辑测试
作用:判断两个或多个条件的依赖关系
&&:逻辑与,且的意思;要求所有条件都得满足
||:逻辑或得意思;多个条件只要满足一个即可
! :逻辑否得意思;表示“不”;当指定条件不成立时,测试命令返回值为0
[root@localhost ~]# [ -e /mnt/ ] && echo "YES" 判断/mnt/目录是否存在,如果存在就输出YES
YES
[root@localhost ~]# [ -f /mnt/ ] && echo "YES" || echo "NO" 判断/mnt/是否为文件,是就输出YES,不是就输出NO
NO
[root@localhost ~]# [ ! -d /mnt/ ] && echo "YES" || echo "NO" 判断/mnt/不是目录,是就输出YES,不是就输出NO
NO
(三)、整数值比较
选项 | 作用 |
---|---|
-eq | 第一个数等于第二个数(Equal) |
-ne | 第一个数不等于第二个数(Not Equal) |
-gt | 第一个数大于第二个数(Greater Than) |
-ge | 第一个数大于或等于第二个数(Greater or Equal) |
-lt | 第一个数小于第二个数(Lesser Than) |
-le | 第一个数小于或等于第二个数(Lesser or Equal) |
[root@localhost ~]# aaa=`df | wc -l` 反撇号:提取命令执行后的输出结果
[root@localhost ~]# echo $aaa
10
[root@localhost ~]# [ $aaa -gt 8 ] && echo "YES" || echo "NO" 判断aaa变量是否大于8,成立输出YES,不成立输出NO
YES
[root@localhost ~]# [ $aaa -eq 8 ] && echo "YES" || echo "NO" 判断aaa变量是否等于8,成立输出YES,不成立输出NO
NO
(四)、字符串比较
作用:用来检查用户输入、系统环境等是否满足条件;来判断用户输入的位置参数是否符合要求等
= : 第一个字符串和第二个字符串相同
!= : 第一个字符串和第二个字符串不相同 (! 就是取反)
-z: 用来检查字符串是否为空
[root@localhost ~]# [ $aaa = 10 ] && echo "YES" || echo "NO" 变量aaa等于10,则输出YES;不等于则输出NO
YES
[root@localhost ~]# [ $aaa != 10 ] && echo "YES" || echo "NO" 变量aaa不等于10,则输出YES,等于则输出NO
NO
编写一个简单脚本
[root@localhost ~]# vim fugai.sh
#!/bin/bash
read -p "是否覆盖文件:" AJBN 定义变量AJBN,并输出提示信息
[ $AJBN = yes | && echo "已覆盖" || echo "未覆盖"
##如果输入的提示信息是yes就输出"已覆盖",否则输出"未覆盖"
通过if 条件语句,实现流程控制方式;满足某个条件时,返回一个结果,否则去实现其他的结果
(一)、单分支if 语句
条件成立,会执行相应的代码;否则不执行其他任何操作
if [ 条件表达式 ] (判断,如果条件成立)
then
命令序列 (执行命令序列)
fi (结束判断:条件不成立,不做任何操作)
单分支流程图:
(二)、双分支语句
满足第一个条件做一个命令操作;除第一个条件以外的所有条件,都做第二个命令操作
if
[ 条件表达式 ]
then
命令序列1
else (除以上条件外的)
命令序列2
fi
双分支流程图:
(三)、多分支语句
根据测试结果的成立或不成立进行多次判断
if 条件测试1
then
命令序列1
elif 条件测试2
then
命令序列2
elif 条件测试3
then
命令序列3
elif 条件测试n
then
命令序列n
else
命令序列(n+1)
fi
(一)单分支if语句应用
[root@localhost ~]# vim 1.sh
#!/bin/bash
aaa=aaa.txt (定义一个变量)
if [ ! -e $aaa ] (判断aaa.txt文件不存在,判断成功后)
then
touch $aaa (当判断成功后,将该文件创建出来)
fi (结束判断:不做任何操作)
[root@localhost ~]# vim 2.sh
#!/bin/bash
read -p "输入要删除文件或目录:" aaa
if [ -e $aaa ] 判断变量aaa文件或目录是否存在,判断成功后
then
rm -rf $aaa 当判断成功后,删除变量aaa
fi 结束判断;不做任何操作
#!/bin/bash
read -p "请输入目标主机IP地址:" dizhi
ping -c 3 -i 0.2 -W 3 $dizhi &> /dev/null
##-c、-i、-W分别表示发送几个测试包、间隔几秒、超时几秒
if [ $? -eq 0 ]
then
echo "Host $dizhi is up"
else
echo "Host $dizhi is down"
fi
[root@localhost ~]# vim 4.sh
#!/bin/bash
systemctl status vsftpd &> /dev/null
if [ $? -eq 0 ]
then
echo "监听地址:$(netstat -anpt | grep vsftpd | awk '{print $4}')"
echo "进程PID号:$(pgrep -x vsftpd)"
else
echo "警告:vsftpd服务不可用"
fi
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# sh 4.sh
监听地址::::21
进程PID号:58347
[root@localhost ~]# systemctl stop vsftpd
[root@localhost ~]# sh 4.sh
警告:vsftpd服务不可用
#!/bin/bash
read -p "请输入你的分数(0-100):" aaa 交换赋值
if [ $aaa -ge 85 ] && [ $aaa -le 100 ] 数值大于85或等于,小于100或等于
then
echo "$aaa 分,优秀!"
elif [ $aaa -ge 70 ] && [ $aaa -le 84 ] 数值大于70或等于,大于84或等于
then
echo "$aaa 分,良好"
elif [ $aaa -ge 60 ] && [ $aaa -le 69 ] 数值大于60或等于,小于69或等于
then
echo "$aaa 分,及格"
elif [ $aaa -le 59 ] 数值小于59或等于
then
echo "$aaa 分,不及格"
else
echo "请输入0-100之间的分数" 当以上条件都不满足时,输出这个
fi