一、使用if选择结构
- if单分支的语法组成:
if 条件测试;then
命令序列
fi
- if双分支的语法组成:
if 条件测试;then
命令序列1
else
命令序列2
fi
- if多分支的语法组成:
if 条件测试1 ;then
命令序列1
elif 条件测试2 ;then
命令序列2
else
命令序列n
fi
步骤一:使用if单分支
判断用户的UID是等于0,如果是,显示:你是管理员,否则没反应
1)编写脚本如下:
[root@sv7 ~]# vim a1.sh
#!/bin/bash
if [ $UID -eq 0 ];then
echo "你是管理员"
fi
[root@sv7 ~]# chmod +x a1.sh
[root@sv7 ~]# ./a1.sh
你是管理员
步骤二:检测/root/dachui/目录,若存在则输出ok,若不存在则创建
[root@sv7 ~]# vim dir.sh
#!/bin/bash
dir="/root/dachui"
if [ -d $dir ];then
echo ok
else
mkdir -p $dir
fi
[root@sv7 ~]# chmod +x dir.sh
[root@sv7 ~]# ./dir.sh
编写脚本,检测并判断指定的主机是否可ping通
1)分析任务需求
使用ping命令检测目标主机时,可通过$?来判断ping目标主机的成败。
为了节省ping测试时间,可以只发送1个测试包(-c 1)
[root@sv7 ~]# ping -c 1 192.168.88.254 &> /dev/null #ping88.254一次,&>无论是否ping通,
[root@sv7 ~]# ping -c 1 192.168.88.254 &> /dev/null #ping88.254一次,&>无论是否ping通,
显示的结果都放到/dev/null中,不在屏幕上显示结果
[root@sv7 ~]# echo $? #执行状态表示成功
0
2)脚本编写参考如下:
[root@sv7 ~]# vim ping.sh
#!/bin/bash
ping -c 1 192.168.88.254 &> /dev/null
if [ $? -eq 0 ] ; then
echo "88.254网络正常"
else
echo "88.254网络异常"
fi
[root@svr5 ~]# chmod +x ping.sh
[root@sv7 ~]# ./ping.sh
88.254网络正常
也可以再次打开脚本,把192.168.88.254改为另外的ip,如192.168.89.254,再次执行脚本显示88.254网络异常
步骤三:从键盘读取一个数值,猜10(包括10)以内的数字大小
[root@sv7 ~]# echo $RANDOM #使用RANDOM的变量(系统自带的变量),输出随机数
25246
[root@sv7 ~]# echo $[RANDOM%10] #使用产生的随机数除以10,求余数
2
[root@sv7 ~]# echo $[RANDOM%10]
1
[root@sv7 ~]# echo $[RANDOM%10+1]
8
1)脚本编写参考如下:
[root@sv7 ~]# vim run.sh
#!/bin/bash
num=$[RANDOM%10+1]
read -p "我有一个1-10的数字,你猜是啥:" cai
if [ $cai -eq $num ];then
echo "猜对了"
elif [ $cai -gt $num ];then
echo "猜大了"
else
echo "猜小了"
fi
[root@sv7 ~]# chmod +x run.sh
[root@sv7 ~]# ./run.sh
我有一个1-10的数字,你猜是啥:1
猜对了
二、使用for循环结构
使用for循环,语法结构如下所示:
for 变量名 in 值1 值2 值3 #值的数量决定循环任务的次数
do
命令序列
done
步骤一:练习for循环基本用法,通过循环批量显示5个hello
[root@sv7 ~]# for i in 1 2 3 4 5
do
echo hello
done
通过循环批量显示10个abc:
[root@sv7 ~]# for i in {1..10}
do
echo "abc"
done
通过循环批量创建10个文件:
[root@sv7 ~]# for i in {1..10}
do
touch $i.txt
done
删除
[root@sv7 ~]# for i in {1..10}
do
rm -rf $i.txt
done
在循环多个值时除了使用echo {1..5}显示外,还可以使用seq
[root@sv7 ~]# seq 5
1
2
3
4
5
编写脚本,批量创建账户
[root@sv7 ~]# vim name.txt #存放用户账号的文件
u1
u2
u3
u4
[root@sv7 ~]# vim adduser.sh
#!/bin/bash
for i in $(cat name.txt) #循环批量创建name.txt里面所有账户,文档中每行是一个用户名,该文档要提前创建,与脚本在同一目录下即可
do
useradd $i
done
[root@sv7 ~]# chmod +x adduser.sh
[root@sv7 ~]# ./adduser.sh
[root@sv7 ~]# id u1
uid=1004(u1) gid=1004(u1) groups=1004(u1)
步骤二:批量检测多个主机的存活状态
优化前面写好的ping脚本
1)编写脚本如下:,可以把{1..5}改为{1..254}测试整个网段
[root@sv7 ~]# vim ping.sh
#!/bin/bash
for i in {1..5}
do
ping -c 1 192.168.88.$i &> /dev/null
if [ $? -eq 0 ] ; then
echo "88.$i 网络正常"
else
echo "88.$i 网络异常"
fi
done
[root@sv7 ~]# ./ping.sh
88.1 网络异常
88.2 网络异常
88.3 网络异常
88.4 网络异常
88.5 网络异常
三、使用while循环结构
while循环属于条件式的执行流程,会反复判断指定的测试条件,只要条件成立即执行固定的一组操作,直到条件变化为不成立为止。所以while循环的条件一般通过变量来进行控制,在循环体内对变量值做相应改变,以便在适当的时候退出,避免陷入死循环。
使用while循环,语法结构如下所示:
while 条件测试 #根据条件的结果决定是否要执行任务,条件测试成功的话就执行,如果失败立刻结束循环
do
命令序列
done
练习while循环基本用法
-le小于等于
无限的循环,i 小于等于5 ,条件成立会一直执行下去,按ctrl +C 中断
[root@sv7 ~]# i=1
[root@sv7 ~]# while [ $i -le 5 ]
do
echo hello
done
有限的循环,每次循环+1
[root@sv7 ~]# i=1
[root@sv7 ~]# while [ $i -le 5 ]
do
echo hello
let i++
done
#死循环的一般格式:
#冒号可以表示条件为真,死循环,Ctrl+C终止
[root@sv7 ~]# while :
do
echo "abc"
done
脚本3,有效循环脚本:
[root@svr5 ~]# vim while03.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo "$i"
let i++
done
优化之前猜数字的脚本
[root@sv7 ~]# vim run.sh
#!/bin/bash
num=$[RANDOM%10+1]
while :
do
read -p "我有一个1-10的数字,你猜是啥:" cai
if [ $cai -eq $num ];then
echo "猜对了"
elif [ $cai -gt $num ];then
echo "猜大了"
else
echo "猜小了"
fi
done
[root@sv7 ~]# ./run.sh #此时脚本猜对了,但是还在执行,应该是猜对了之后退出脚本
我有一个1-10的数字,你猜是啥:2
猜对了
我有一个1-10的数字,你猜是啥:
[root@sv7 ~]# vim run.sh
#!/bin/bash
num=$[RANDOM%10+1]
while :
do
read -p "我有一个1-10的数字,你猜是啥:" cai
if [ $cai -eq $num ];then
echo "猜对了"
exit #添加exit,猜对了之后退出脚本
elif [ $cai -gt $num ];then
echo "猜大了"
else
echo "猜小了"
fi
done