目录
条件测试操作
条件测试的基本用法:
- "test 表达式"或者[ 表达式 ]都可以,表达式两边至少要留出一个空格
[root@server0 opt]# test a == a #判断字符串a是否等于a
[root@server0 opt]# echo $? #查看结果,0为判断成功,非0为失败
0
[root@server0 opt]# test a == b
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ a == a ] #另一种格式,效果同上,字符串两边要有空格!!!
[root@server0 opt]# echo $?
0
[root@server0 opt]# [ a == b ]
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ $USER == root ] #判断当前登录用户是否为root
[root@server0 opt]# echo $?
0
字符串条件测试:
- == 比较两个字符串是否相同
- != 比较两个字符串是否不相同
- -z 检查变量的值是否为空值
- ! -z检查变量的值是否为非空值
- -n 检查变量的值是否为非空值(等同于! -z)
[root@server0 opt]# [ a != b ] #判断a是否不能于b
[root@server0 opt]# echo $?
[root@server0 opt]# [ -z $a ] #判断变量a是否为空值
[root@server0 opt]# echo $? #如果为空值则输出为0
1
[root@server0 opt]# [ $a == b ] #判断变量a是否等于b,如果变量a为空会报错
[root@server0 opt]# [ "$a" == b ]#解决上上述问题
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ ! -z $a ] #判断变量a是否非空
[root@server0 opt]# echo $?
0
-eq与==都有判断是否相等的意思,区别是"=="主要用于 判断字符串两边是否相等,而-eq主要用于判断数字
[root@server0 opt]# [ 0123 == 123 ]
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ 0123 -eq 123 ]
[root@server0 opt]# echo $?
0
逻辑组合
逻辑与: && 之前命令成功才会执行之后的命令
逻辑或: || 之前命令失败才会执行之后的命令
&& 前后任务都成功才算成功
|| 前后有一个任务成功就算成功
[root@server0 opt]# vim test01.sh
#!/bin/bash
read -p "请输入一个用户名" a
[ -z $a ] && echo "给我名字!" && exit #如果没有输入用户名输出"给我名字!"然后直接退出
useradd $a
stty -echo
read -p "请输入密码" p
stty echo
echo $p | passwd --stdin $a
[root@server0 opt]# bash test01.sh
请输入一个用户名
给我名字!
[root@server0 opt]# ls && ls && ls #三次都执行成功
rh test01.sh
rh test01.sh
rh test01.sh
[root@server0 opt]# ls || ls || ls #只有第一个条件成功
rh test01.sh
[root@server0 opt]# ls || ls && ls #第一个条件和第三个条件执行成功
rh test01.sh
rh test01.sh
[root@server0 opt]# ls && ls || ls #第一个条件和第二个条件执行成功
rh test01.sh
rh test01.sh
数字的条件测试:
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-ge | 大于等于 |
-lt | 小于 |
-le | 小于等于 |
[root@server0 opt]# [ 10 -gt 10 ] || echo "ok"&& echo "no"
ok
no #两次执行均成功,显示OK和no
[root@server0 opt]# [ 10 -gt 10 ] && echo "ok"|| echo "no"
no #前次执行不成功
编写一个脚本:
每隔两分钟检查主机的登录账户数量,如果超过3人,则发邮件给管理员报警
[root@server0 opt]# vim test02.sh
#!/bin/bash
a=$(who | wc -l) #统计有几个人登录该账户
[ $a -gt 3 ] && echo "有人入侵!!!" | mail -s test root
[root@server0 opt]# bash test02.sh
可以多开几个终端试一下
[root@server0 opt]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 root Fri Jan 3 11:39 18/595 "test"
& 1
Status: R
有人入侵!!!
Held 1 message in /var/spool/mail/root
[root@server0 opt]# crontab -e
*/2 * * * * /opt/test02.sh #每隔两分钟执行该脚本
[root@server0 opt]# chmod +x test02.sh #一定要给脚本加权限!!!!!
[root@server0 opt]# rm -rf /var/spool/mail/root #可以先删除所有邮件,该路径为专门存放root用户邮件
[root@server0 opt]# mail #查看邮件
对文件进行测试:
-e | 判断对象是否存在(不管是文件还是目录),存在则结果为真 |
-d | 判断对象是否为目录,是则为真 |
-f | 判断对象是否为一般文件,是则为真 |
-r | 判断当前用户对文件是否有读权限 |
-w | 判断当前用户对文件是否有写权限 |
-x | 判断当前用户对文件是否有执行权限 |
[root@server0 opt]# [ -e /opt/123 ] #测试123是否存在,不关心文件类型
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ -f /opt/123 ] #测试123文件是否存在,必须是普通文件
[root@server0 opt]# echo $?
1
[root@server0 opt]# mkdir abc
[root@server0 opt]# [ -f /opt/abc ] #测试abc是否存在,必须是普通文件
[root@server0 opt]# echo $?
1
[root@server0 opt]# [ -d /opt/abc ] #测试abc是否存在,必须是目录
[root@server0 opt]# echo $?
0
[root@server0 opt]# [ -r /opt/abc ] #当前用户对abc是否能读
[root@server0 opt]# echo $?
0
[root@server0 opt]# [ -w /opt/abc ] #当前用户对abc是否能写
[root@server0 opt]# echo $?
0
[root@server0 opt]# [ -x /opt/abc ] #当前用户对abc是否能执行
[root@server0 opt]# echo $?
0
#建议写绝对路径!
即使文件没有任何权限,用管理员身份测试rwx权限,rw依旧为0,x为非0
if判断语句
单分支
if 条件测试;then
执行指令1
执行指令2
.......
fi
双分支
if 条件测试;then
执行指令1
else
执行指令2
fi
多分支
if 条件测试1;then
执行指令1
elif 条件测试2;then
执行指令2
else
执行指令n
fi
if双分支:
[root@server0 opt]# vim test03.sh
#!/bin/bash
if [ $USER == root ];then
echo "ok"
else
echo "no"
fi
[root@server0 opt]# bash test03.sh
ok
[root@server0 opt]# su - student
[student@server0 ~]$ cd /opt
[student@server0 opt]$ bash test03.sh
no
if多分支:
[root@server0 opt]# vim test04.sh
#!/bin/bash
read -p "请输入数字" n
if [ $n -gt 90 ];then
echo "优秀"
elif [ $n -gt 70 ];then
echo "良好"
elif [ $n -gt 60 ];then
echo "及格"
else
echo "回炉"
fi
[root@server0 opt]# bash test04.sh
请输入数字
编写一个脚本:
对某一个IP进行ping操作,可以使用变量(read 或 位置变量$1),方便多次使用脚本
ping命令: ping -c 数字 指定ping的次数
ping -i 数字 指定ping的间隔时间,默认ping的间隔时间为1秒钟
ping -W 数字 指定ping的时候不通反馈时间(秒),提高效率
[root@server0 opt]# vim test05.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 1 172.25.0.12 &> /dev/null
if [ $? -eq 0 ];then
echo "通了"
else
echo "不通"
fi
[root@server0 opt]# bash test05.sh
不通
编写一个脚本:
猜数游戏,计算机出一个随机的数字,你出一个数字,比计算机大则输出猜大了,比计算机小则输出猜小了,一样则输出恭喜你猜中了!
[root@server0 opt]# vim test06.sh
#!/bin/bash
for i in {1..20}
do
x=$[$RANDOM%10]
read -p "请输入一个数字(0-9)" n
if [ $x -eq $n ];then
echo "恭喜,猜对了!"&& exit
elif [ $n -lt $x ];then
echo "猜小了,想知道正确答案吗,求我呀!"
else
echo "猜大了,垃圾!"
fi
done
for循环
for 变量名称 in 值1 值2 值 3....
do
指令
done
[root@server0 opt]# vim test07.sh
#!/bin/bash
a=0
b=0
for i in `seq 15` #也可以写成{1..15}
do
ping -c 3 -i 0.1 -W 1 172.25.0.$i &> /dev/null
if [ $? -eq 0 ];then
echo "172.25.0.$i通了"
let a++
else
echo "172.25.0.$i不通"
let b++
fi
done
[root@server0 opt]# bash test07.sh
172.25.0.1不通
172.25.0.2不通
172.25.0.3不通
172.25.0.4不通
172.25.0.5不通
172.25.0.6不通
172.25.0.7不通
172.25.0.8不通
172.25.0.9不通
172.25.0.10通了
172.25.0.11通了
172.25.0.12不通
172.25.0.13不通
172.25.0.14不通
172.25.0.15不通
2台通了,13台不通
while循环:可以无限循环
while 条件测试
do
执行指令
done
[root@server0 opt]# vim test08.sh
#!/bin/bash
while : #冒号代表无限循环
do
echo 123
sleep 0.1
done