SHELL脚本编程:条件测试 、 if选择结构和循环结构(SHELL----DAY28)

回顾
脚本的规范
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 ] a b , a [ " a == b ] 判断变量a是否等于b,如果变量a为空会报错 [ " 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 [ ? e q 0 ] ; t h e n e c h o " 172.25.0. ? -eq 0 ];then echo "172.25.0. i通了"
let x++
else
echo “172.25.0. i " l e t y + + f i d o n e e c h o " i不通" let y++ fi done echo " 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

发布了55 篇原创文章 · 获赞 0 · 访问量 411

猜你喜欢

转载自blog.csdn.net/weixin_45533230/article/details/104202094