1. 条件测试
作用: 赋予脚本智能判断的效果
文件或者目录的读/写等状态
数值的大小
字符串是否匹配
多条件组合
语法格式
test 选项 参数
或者 [ 选项 参数 ]
常见的测试操作
1. 对字符串进行测试
a=abc
b=xyz
字符串比较
==
两边是否相等,相等时条件测试算成功
[ $a == $b ] //使用变量判断两个变量的值是否相等
!=
两边是否不等,不相等时条件测试算成功
[ $a != $b ] //使用变量判断两个变量的值是否不相等
-z
判断变量是否为空
[ -z $a ] //判断变量是否为空,为空时条件测试算成功
! -z
判断变量是否非空
[ ! -z $a ] //判断变量是否非空,非空时条件测试算成功
整数值比较
格式: [ 字符串1 操作符 字符串2 ]
实例: 检查已经登陆的用户数,是否不超过5个
[root@localhost ~]# who | wc -l
2
[root@localhost ~]#[ $(who | wc -l) -le 5 ] && echo "YES"
YES
2. 文件状态测试
格式:[ 操作符 文件或目录 ]
[ -e abc ] //判断当前目录下的abc是否存在,用echo $?查结果
[ -f /opt/abc ] //判断opt下有没有abc这个普通文件
[ -d /opt/abc ] //判断opt下有没有abc这个目录
mkdir xyz
[ -d /opt/xyz ] //判断opt下有没有xyz这个目录
[ -r /opt/abc ] //判断当前用户对abc是否有读权限
[ -w /opt/abc ] //判断当前用户对abc是否有写权限
[ -x /opt/abc ] //判断当前用户对abc是否有x权限
3. 组合多个条件
格式: 命令1 操作符 命令2 ...
或者 [ 条件1 ] 操作符 [ 条件2 ] ...
实例1: 当前用户为root,且位于/root目录下
[root@localhost ~]# [ $USER == "root" ] && [ $PWD == "root" ]
[root@localhost ~]# [ $? -eq 0 ] && echo YES
YES
实例2: 当/opt/testdir目录不存在时,创建该目录
[root@localhost ~]# [ -d "/opt/testdir"] || madir -p /opt/testdir
[root@localhost ~]# ls -ld /opt/testdir/
drwxr-xr-x 2 root root 4096 09-20 12:56 /opt/testdir
If选择结构
单分支结构
特点: 当条件成立时执行命令序列,反之不执行
格式
案例
需求
判断挂载点目录/mnt/dvd是否存在,若不存在则创建
代码实现
#! /bin/bash
mount_dir=/mnt/dvd
if [ !-d $mount_dir ]
then
mkdir -p $mount_dir
fi
双分支结构
特点: 当条件成立时执行命令序列1,否则执行命令序列2
格式
案例
需求
- 检测并判断指定的主机是否可以ping通
- 目标主机的地址以位置参数提供
代码实现
#! /bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]; then
echo "Host $1 is up"
else
echo "Host $1 is down"
fi
多分支结构
特点: 相当于if语句嵌套,针对多个条件分别执行不同的操作
格式
案例
需求
- 输入一个分数, 判断成绩分档
- 85~100 优秀, 70~84 良好,低于70分不及格
代码实现
#! /bin/bash
read -p "请输入分数(0-100):"FS
if [ $FS -ge 85 ] && [ $FS -le 100 ];then
echo "$FS分!优秀"
elif [ $FS -ge 70 ] && [ $FS -le 84 ];then
echo "$FS分!合格"
else
echo "$FS分!不合格"
fi