回顾
脚本的规范
1,声明解释器
#!/bin/bash
2,注释
3,执行代码
脚本的运行方式
1, 添加x权限
2, 使用解释器
3, 使用source命令,或.
. test.sh
./test.sh
变量
1, 自定义变量 变量名=变量的值 ${} a=10 echo ${a}RMB
2,环境变量
HOSTNAME USER UID HOME SHELL PWD PATH PS1 PS2
3,位置变量与预定义变量
$1 $2 $3 …
$0 $# $* $? $$
变量扩展
‘’ “” 界定范围
`` 反撇号 $( )
read -p “XXX” 变量名
stty -echo
stty echo
局部变量
exprot 变量名
exprot -n 变量名
shell中的运算
expr 1 + 1
expr 2 * 2
a=10
expr $a + 1
echo $[1+1]
echo $[a+a]
echo $[a*a]
let a=1+1
let a=a+1 a++
let a=a-1 a–
let a*=10
bc echo 1+1 | bc scale=
条件测试,可以使脚本拥有更高的智能
test a == a 判断 字符串a是否等于a
echo $? 查看结果,0为判断成功, 非0为失败
test a == b
echo $?
[ a == a ] 另一种格式,效果同上,字符串两边有空格
echo $?
[ a == b ]
echo $?
[ $USER == root ] 判断当前用户名是否叫root
echo $? 查看结果
[ a != b ] 判断a是否不等于b
[ -z $a ] 判断 变量a是否为空
echo $? 如果为空,输出0
[
a" == b ] 解决上述问题
echo $?
[ ! -z $a ] 判断变量a是否非空
echo $?
逻辑组合
&& 之前命令成功才执行之后命令
|| 之前命令失败才执行之后命令
当使用2个逻辑符号时:
&& 前后任务都成功才算成功
|| 前后有一个任务成功就算成功
ls && ls && ls
ls || ls || ls
ls && ls || ls
ls || ls && ls
[ $USER == root ] && echo “ok” || echo “no”
[ a == a ] && echo “相等” || echo “不等”
a=
[ -z $a ] && echo “为空” || echo “非空”
2,数字的条件测试
-eq 等于
-ne 不等于
-ge 大于等于
-gt 大于
-le 小于等于
-lt 小于
[ 10 -le 10 ] && echo “ok” || echo “no”
[ 10 -gt 11 ] && echo “ok” || echo “no”
每隔2分钟检查主机的登录账户数量,如果超过3人,则发邮件给管理员报警
#!/bin/bash
x=who |wc -l
[ $x -gt 3 ] && echo “有人入侵服务器~!” | mail -s test root
chmod +x test01.sh
crontab -e
*/2 * * * * /opt/test01.sh
rm -rf /var/spool/mail/root 可以先删除所有邮件
mail 查看邮箱
3,对文件进行测试
-e 文件是否存在
-d 文件是否存在,且是目录
-f 文件是否存在,且是普通文件
-r 当前用户对文件是否有读权限
-w 当前用户对文件是否有写权限
-x 当前用户对文件是否有执行权限
-s 文件大小非0时为真
[ -e /opt/123 ] 测试123是否存在,不关心文件类型
echo $?
[ -f /opt/123 ] 测试123是否存在,必须是普通文件
mkdir abc
[ -f /opt/abc ] 测试abc是否存在,必须是普通文件
[ -d /opt/abc ] 测试abc是否存在,必须是目录
[ -r /opt/123 ] 当前用户对123是否能读
[ -w /opt/123 ] 当前用户对123是否能写
[ -x /opt/123 ] 当前用户对123是否能执行
使用if判断语句
1,单分支
if 条件测试;then
执行指令1
执行指令2
…
fi
2,双分支
if 条件测试1;then
执行指令1
else
执行指令2
fi
3,多分支
if 条件测试1;then
执行指令1
elif 条件测试2;then
执行指令2
else
执行指令n
fi
利用if双分支判断ping的结果
ping工具选项 -c 设置ping次数
-i 设置ping间隔时间(秒)
-W 设置不通时的反馈时间(秒)
#!/bin/bash
ping -c 3 -i 0.2 -W 1 172.25.0.12 &> /dev/null
if [ $? -eq 0 ];then
echo “通了”
else
echo “不通”
fi
for循环
#!/bin/bash
a=10
for i in seq $a
do
echo $i
done
#!/bin/bash
x=0
y=0
for i in {1…15}
do
ping -c 3 -i 0.2 -W 1 172.25.0.$i &> /dev/null
if [
i通了"
let x++
else
echo “172.25.0.
x台通了,$y台不通”
while循环,可以实现无限次循环
#!/bin/bash
while :
do
echo 123
sleep 0.1
done
#!/bin/bash
x=$[RANDOM%100]
while :
do
read -p “请输入一个数字(0-99)” n
if [ $x -eq $n ];then
echo “猜对了!”
elif [ $x -lt $n ];then
echo “猜大了”
else
echo “猜小了”
fi
done