一、使用case分支语句
1.case语句的结构
case 变量值 in
模式 1)
命令序列 1
;;
模式 2)
命令序列 2
;;
......
*)
默认命令序列
esac
(1)case行尾必须为单词“in”,每一模式必须以右括号“)”结束。
(2)双分号“;;”表示命令序列的结束。
(3)模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号“|”表示或,如“A|B”。
(4)最后的“*)”表示默认模式,其中的*相当于通配符
(5)case语句执行流程图:

2.case语句应用示例
提示用户从键盘输入一个字符,通过case语句判断该字符是否为字母、数字或者特殊符号,并给出相应的提示信息。
脚本:
#!/bin/bash
read -p "请输入一个字符:" key
case $key in
[a-z]|[A-Z])
echo "你输入的是字母"
;;
[0-9])
echo "你输入的是数字"
;;
*)
echo "你输入的是特殊符号"
esac
执行脚本的结果:
[root@localhost ~]# ./shan.sh
请输入一个字符:6
你输入的是数字
[root@localhost ~]# ./shan.sh
请输入一个字符:c
你输入的是字母
[root@localhost ~]# ./shan.sh
请输入一个字符:%
你输入的是特殊符号
二、使用for循环语句
1.for语句的结构
for 变量名 in 取值列表
do
命令序列
done
(1)for语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置一个取值列表,多个取值之间以空格进行分隔。
(2)位于do......done之间的命令序列称为“循环体”,其中的执行语句需要引用变量已完成相应的任务。
(3)for语句的执行流程:

2.for语句应用示例
(1)根据姓名列表批量添加用户
根据人事部门给出的员工姓名的拼音列表,在Linux服务器中添加相应的用户账号,初始密码均设置为“123456”。其中,员工姓名列表中的账号数量并不固定,而且除了要求账号名称是拼音之外,并无其他特殊规律。
根据以上的要求,可先指定员工列表文件/opt/name.txt,然后编写一个名为demo01.sh的Shell脚本,从/opt/name.txt文件中读取各用户名称,重复执行添加用户、设置初始密码的相关操作。
[root@localhost ~]# vim /opt/name.txt //用于测试的列表文件
zhangsan
lisi
wangwu
[root@localhost ~]# vim demo01.sh //批量添加用户的脚本
#!/bin/bash
TMP=$(cat /opt/name.txt)
for USER in $TMP
do
useradd $USER
echo "123456"|passwd --stdin $USER &> /dev/null
done
[root@localhost ~]# chmod +x demo01.sh
[root@localhost ~]# ./demo01.sh //测试并确认执行结果
[root@localhost ~]# tail -5 /etc/passwd
stu551:x:1554:1554::/home/stu551:/bin/bash
jiangming:x:1555:1555::/home/jiangming:/bin/bash
qizhen:x:1556:1556::/home/qizhen:/bin/bash
xuyong:x:1557:1557::/home/xuyong:/bin/bash
caozhentao:x:1558:1558::/home/caozhentao:/bin/bash
若要删除demo01.sh脚本所添加的用户,只需将for循环体当中添加用户的命令序列改为删除用户的操作即可。
[root@localhost ~]# vim demo01.sh //批量删除用户的脚本
#!/bin/bash
TMP=$(cat /opt/name.txt)
for USER in $TMP
do
userdel -r $USER &> /dev/null
done
[root@localhost ~]# ./demo01.sh //测试并确认执行结果
[root@localhost ~]# id jiangming
id: jiangming: no such user
(2)根据IP地址表查看主机状态
要求:IP地址存放在ipadds.txt文件中,每行一个;
使用ping命令检测各主机的连通性
[root@localhost ~]# vim /root/ipadds.txt //用做测试的脚本文件
192.168.180.134
192.168.100.88
192.168.100.99
[root@localhost ~]# vim demo02.sh //循环检测各主机的脚本
#!/bin/bash
HLIST=$(cat /root/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -M 3 $IP &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $IP is up."
else
echo "Host $IP is down."
fi
done
[root@localhost ~]# chmod +x demo02.sh
[root@localhost ~]# ./demo02.sh //测试并确认检测结果
Host 192.168.180.134 is down.
Host 192.168.100.88 is down.
Host 192.168.100.99 is down.
三、使用while循环语句
1.while语句的结构
while 条件测试操作
do
命令序列
done
while语句的执行流程:

2.while语句应用示例
(1)批量添加用户
要求:用户名称已stu开头,按数字序号进行编号;
一共添加20个用户;
初始密码均设置为123456;
[root@localhost ~]# vim demo03.sh
#!/bin/bash
num=1
while [ $num -le 20 ]
do
useradd stu$num
#echo "123456" | passwd --stdin stu$num &> /dev/null
userdel -r stu$num &> /dev/null
let num++
done
[root@localhost ~]# chmod +x demo03.sh
[root@localhost ~]# tail -20 /etc/passwd
stu1:x:1004:1004::/home/stu1:/bin/bash
stu2:x:1005:1005::/home/stu2:/bin/bash
stu3:x:1006:1006::/home/stu3:/bin/bash
stu4:x:1007:1007::/home/stu4:/bin/bash
stu5:x:1008:1008::/home/stu5:/bin/bash
stu6:x:1009:1009::/home/stu6:/bin/bash
stu7:x:1010:1010::/home/stu7:/bin/bash
stu8:x:1011:1011::/home/stu8:/bin/bash
stu9:x:1012:1012::/home/stu9:/bin/bash
stu10:x:1013:1013::/home/stu10:/bin/bash
stu11:x:1014:1014::/home/stu11:/bin/bash
stu12:x:1015:1015::/home/stu12:/bin/bash
stu13:x:1016:1016::/home/stu13:/bin/bash
stu14:x:1017:1017::/home/stu14:/bin/bash
stu15:x:1018:1018::/home/stu15:/bin/bash
stu16:x:1019:1019::/home/stu16:/bin/bash
stu17:x:1020:1020::/home/stu17:/bin/bash
stu18:x:1021:1021::/home/stu18:/bin/bash
stu19:x:1022:1022::/home/stu19:/bin/bash
stu20:x:1023:1023::/home/stu20:/bin/bash
(2)猜商品价格游戏
要求:通过变量RANDOM获得随机数;
提示用户猜测并记录次数,猜中后退出循环
[root@localhost ~]# vim demo04.sh
#!/bin/bash
SHAN=$(expr $RANDOM % 1000)
NUM=0
echo "商品实际价格为0-999,猜猜看是多少?"
while true
do
read -p "请输入你猜测的价格:" INT
let NUM++
if [ $INT -eq $SHAN ]
then
echo "恭喜你答对了,实际价格是$SHAN"
echo "你共猜测了$NUM次"
exit 0
elif [ $INT -gt $SHAN ]
then
echo "太高了!"
else
echo "太低了!"
fi
done
[root@localhost ~]# chmod +x demo04.sh
[root@localhost ~]# ./demo04.sh
商品实际价格为0-999,猜猜看是多少?
请输入你猜测的价格:500
太低了!
请输入你猜测的价格:600
太低了!
请输入你猜测的价格:700
太低了!
请输入你猜测的价格:800
太高了!
请输入你猜测的价格:750
太高了!
请输入你猜测的价格:740
太高了!
请输入你猜测的价格:730
太高了!
请输入你猜测的价格:720
太高了!
请输入你猜测的价格:710
太低了!
请输入你猜测的价格:709
太低了!
请输入你猜测的价格:715
太低了!
请输入你猜测的价格:719
太高了!
请输入你猜测的价格:717
恭喜你答对了,实际价格是717
你共猜测了13次
四、使用until语句
1.until语句的结构
until 条件测试操作
do
命令序列
done
until语句的执行流程:

2.until语句应用示例
(1)计算1-50的和值
要求:通过循环累加的方式计算1-50的和值
[root@localhost ~]# vim demo04.sh
#!/bin/bash
i=0
num=0
until [ $i -eq 51 ];do
let num+=i;let i++
done
echo $num
[root@localhost ~]# chmod +x demo04.sh
[root@localhost ~]# ./demo04.sh
1275
(2)为指定用户发送在线消息
要求:若用户不在线,则每5秒试一次,直到用户登录系统后再发送信息;
用户名与消息通过位置参数传递给脚本。
[root@localhost ~]# vim demo02.sh
#!/bin/bash
username=$1
#判断信息格式
if [ $# -lt 1 ];then
echo "Usage:`basename $0` <username> [<message>]"
exit 1
fi
#判断用户是否存在
if grep "^$username:" /etc/passwd > /dev/null;then :
else
echo "用户不存在"
exit 1
fi
#用户是否在线,如果不在线每5秒联系一次
until who|grep "$username" > /dev/null;do
echo "用户不在线"
sleep 5
done
#发送信息
mes=$*
echo $mes | write $username
当用户不在线时,执行脚本
[root@localhost ~]# ./demo02.sh lisi
用户不在线
用户不在线
用户不在线
用户不在线
当用户登录在线时,执行脚本
[root@localhost ~]# ./demo02.sh shan
