条件测试,可以赋予脚本智能判断的效果
语法格式 1, test 表达式 2, [ 表达式 ]
1,对字符串进行测试
== 两边是否相等,相等时条件测试算成功
!= 两边是否不等,不相等时条件测试算成功
test a == a //方式一:test ,使用常量判断,再用echo $?测试结果
test a == b
[ a == a ] //方式二:中括号,使用常量判断,再用echo $?测试结果
[ a == b ]
a=abc
a=xyz
[ $a == $b ] //使用变量判断两个变量的值是否相等
[ $a != $b ] //使用变量判断两个变量的值是否不相等
[ "$c" == $b ] //如果变量为空,有可能报错,加双引号可以避免
-z
[ -z $a ] //判断变量是否为空,为空时条件测试算成功
[ ! -z $a ] //判断变量是否非空,非空时条件测试算成功
逻辑组合
条件 && 指令 条件成功才执行指令
条件 || 指令 条件失败才执行指令
[ root == $USER ] || exit //判断当前用户名是否为root
如果判断失败,则执行exit
[ $USER != root ] && exit //判断当前用户名是否不为root
如果判断成功,则执行exit
#!/bin/bash
[ $USER == "root" ] || exit
yum -y install vsftpd &> /etc/null
systemctl restart vsftpd
systemctl enable vsftpd
当多个逻辑符号组合使用时
A && B A、B任务都成功算成功
A || B A、B 任务有一个成功算成功
[root@localhost opt]# touch a b c
[root@localhost opt]# ls a && ls b && ls c
a
b
c
[root@localhost opt]# ls a || ls b || ls c
a
[root@localhost opt]# ls a && ls b || ls c
a
b
[root@localhost opt]# ls a || ls b && ls c
a
c
[ root != $USER ] && echo "非管理员不能执行该脚本" && exit //之前的语句可以改进成这个方式
#!/bin/bash
[ root != $USER ] && echo "非管理员不可执行" && exit
yum -y install vsftpd &> /etc/null
systemctl restart vsftpd
systemctl enable vsftpd
数字
-eq 是否相等 -ne 是否不等 -gt 是否大于
-ge 是否大于等于 -lt 是否小于 -le 是否小于等于
-eq (Equal)
-ne (Not Equal)
-ge (Greater or Equal)
-le (Less or Equal)
-gt (Greater Than)
-lt (Less Than)
编写脚本,每2分钟检查服务器的用户数量,如果发生变化
则发邮件通知管理员
echo "测试" | mail -s test root //编写脚本前,测试下邮件功能是否正常 ,mail -s是发送邮件,test是标题,root是给谁发,echo后面写要发送的邮件内容
使用上述命令发邮件,再敲mail命令打开邮件列表即可看到邮件,按邮件列表对应的数字回车可以查看邮件内容
如果邮件太多可以删除/var/spool/mail/root文件清空邮箱
#!/bin/bash
x=$(cat /etc/passwd | wc -l) //将目前用户数量赋值给变量x
[ $x -gt 29 ] && echo "用户数量发生变化,服务器可能被入
侵" | mail -s test root //如果目前用户数量大于29,就
发邮件给管理员,29是之前查看的用户数量
chmod u+x test01.sh //然后给脚本加x权限
crontab -e //编写计划任务
*/2 * * * * /opt/test01.sh //定义每2分钟执行脚本
- 文件
-e 判断文件是否存在,不关心类型
-f 判断文件是否存在,必须是普通文件
-d 判断文件是否存在,必须是目录
-r 判断当前用户对文件是否有读权限,对root无效
-w 判断当前用户对文件是否有写权限,对root无效
-x 判断当前用户对文件是否有x权限
[ -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权限
== != -z ! -z
&& ||
-eq -ne -gt -ge -lt -le
-e -f -d -r -w -x
if分支
- 单分支
if 条件测试;then //满足条件的话就执行下面指令
执行指令
fi
#!/bin/bash
if [ $UID -eq 0 ];then
echo "管理员"
echo "无敌"
fi
- 双分支
if 条件测试;then //满足条件的话就执行下面指令
执行指令A //指令可以是一条,也可以是多条
else //否则,不满足条件的话就执行下面指令
执行指令B
fi
#!/bin/bash
if [ $UID -eq 0 ];then
echo "管理员"
echo "无敌"
else
echo "无权执行"
fi
ping -c 3 -i 0.2 -W 1 192.168.2.254
// -c 定义ping的次数 -i 定义ping的间隔时间(秒)
-W ping失败时多久反馈结果
使用if双分支编写ping脚本
#!/bin/bash
ping -c 2 -i 0.2 -W 1 192.168.4.110 &> /dev/null
if [ $? -eq 0 ];then
echo "通"
else
echo "不通"
fi
这里Ping的是自己的主机地址
修改地址后:
多分支
if 条件测试;then //满足条件的话就执行下面A指令
执行指令A //指令可以是一条,也可以是多条
elif 条件测试;then //满足条件的话就执行下面B指令
执行指令B
elif 条件测试;then //满足条件的话就执行下面C指令
执行指令C
else //否则,不满足条件的话就执行下面指令
执行指令
fi
#!/bin/bash
read -p "过年花了几天时间学习?" x
if [ $x -eq 9 ];then
echo "NB!"
elif [ $x -ge 5 ];then
echo "YBB!"
elif [ $x -ge 2 ];then
echo "BB!"
else
echo "回家吧!"
fi
~
循环,可以反复执行某任务
for循环,可以定义循环次数
for 变量名称 in 值1 值2 值3 。。。。 //此处变量名可以自定义,通常习惯
用i,值的多少决定了下面do与done之间的任务执行多少次,每个值之间有空
格,这里是有3个值,所以就循环执行指令3次
do
任务
done
vim name.txt
tom
t1
t2
t3
t4
t5
t6
t7
t8
t9
t0
---------------------------------------------------------------------------------------
vim test06.sh
#!/bin/bash
for i in $(cat name.txt)
do
useradd $i
done
批量测试ip地址通不通:
#!/bin/bash
for i in {101..110}
do
ping -c 2 -i 0.2 -W 1 192.168.4.$i &> /dev/null
if [ $? -eq 0 ];then
echo "192.168.4.$i通"
else
echo "192.168.4.$i不通"
fi
done