文章目录
前言:
除了我们之前讲述的if条件语句外,作为一种脚本编程语言,Shell同样包含循环、分支等其他程序结构,从而能够轻松完成更加复杂的工作,本篇博客主要介绍case、for、while语句的具体应用。
一、case多分支语句
1.1 case语句的结构
- 针对变量额不同取值,分别执行不同的命令序列
双份号 ;; 表示一句话的结束并且退出
如果模式1没有匹配上,则退出并匹配下一个模式,直到匹配到*,中间一旦匹配符合之后将输出。
if 与 case
if 、else 语句适合判断区间范围
case 更适合用于判断某一固定值、字符串等
1.2 case语句应用示例
- 需求 1 :击键类型识别
提示用户输入一个字符
判断该字符是字母、数字或是符号
实验:
[root@localhost demo]# vi demo1.sh
#!/bin/bash
read -p "请输入一个字符:" word
case "$word" in
#数字匹配
[0-9])
#命令序列1
echo "你输入的是数字"
;;
[a-z]|[A-Z])
#命令序列2
echo "你输入的是字母"-
;;
*)
#命令序列3
echo "你输入的是符号"
esac
-----> wq (保存并退出)
[root@localhost demo]# chmod +x demo1.sh
[root@localhost demo]# ./demo1.sh
请输入一个字符:2
你输入的是数字
[root@localhost demo]# ./demo1.sh
请输入一个字符:a
你输入的是字母
[root@localhost demo]# ./demo1.sh
请输入一个字符:!
你输入的是符号
- 需求 2 :编写系统服务脚本
使用start、stop、restart等参数来控制服务
服务控制指定通过位置变量$1传入
实验:
[root@localhost demo]# vi demo02.sh
#!/bin/bash
case "$1" in
start)
echo "正在启动sleep服务"
if sleep 3
then
echo "已启动sleep服务"
fi
;;
stop)
echo "正在停止sleep服务"
pkill "sleep" &> /dev/null
echo "已停止sleep服务"
;;
restart|reload)
$0 stop
$0 start
;;
*)
echo "Usage:$0 start|stop|restart"
esac
[root@localhost demo]# chmod +x demo02.sh
[root@localhost demo]# ./demo02.sh start
正在启动sleep服务
已启动sleep服务 (等待3秒后显示该信息)
[root@localhost demo]# ./demo02.sh stop
正在停止sleep服务
已停止sleep服务
[root@localhost demo]# ./demo02.sh restart
正在停止sleep服务
已停止sleep服务
正在启动sleep服务
已启动sleep服务
二、for循环语句
2.1 for循环语句结构
2.2 for语句应用示例
- 需求 1:批量添加用户
用户名存放在users.txt文件中,每行一个
初始密码均设为123456
验证脚本
实验:
[root@localhost opt]# cat users.txt
zhangsan
zhaoliu
tianqi
[root@localhost opt]# tail -5 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
dings:x:1000:1000:dings:/home/dings:/bin/bash
wangwu:x:1001:1001::/home/wangwu:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lisi:x:1002:1002::/home/lisi:/bin/bash
[root@localhost opt]# cat users.sh
#!/bin/bash
users=$(cat /opt/users.txt)
for add in $users
do
useradd $add
echo "123456" | passwd --stdin $add &> /dev/null
done
[root@localhost opt]# chmod +x users.sh
[root@localhost opt]# ./users.sh
[root@localhost opt]# tail -5 /etc/passwd
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lisi:x:1002:1002::/home/lisi:/bin/bash
zhangsan:x:1003:1003::/home/zhangsan:/bin/bash
zhaoliu:x:1004:1004::/home/zhaoliu:/bin/bash
tianqi:x:1005:1005::/home/tianqi:/bin/bash
(三个用户创建成功)
- 需求 2 :根据IP地址检查主机状态
IP地址存放在ipadds.txt文件中,每行一个
使用ping命令检测个主机的连通性
实验:
[root@localhost opt]# cat ipadds.txt
192.168.181.1
192.168.0.103
192.168.137.1
[root@localhost opt]# cat ping.sh
#!/bin/bash
tmp=$(cat /opt/ipadds.txt)
for ip in $tmp
do
ping -c 3 -W 4 -i 0.2 $ip &> /dev/null
if [ $? -eq 0 ]
then
echo "HOST $ip is up"
else
echo "HOST $ip is down"
fi
done
[root@localhost opt]# chmod +x ping.sh
[root@localhost opt]# ./ping.sh
HOST 192.168.181.1 is up
HOST 192.168.0.103 is up
HOST 192.168.137.1 is up
ping [选项]中
-c 2 :表示ping两个包
-W 4 :表示前后两个包ping的间隔未4秒
-i 0.2 :表示反应时间
三、while 循环语句
3.1 while 语句结构
- 重复测试某个条件,只要条件成立则反复执行
3.2 while 语句应用示例
- 需求 1:批量添加用户
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1、stu2、…、stu20
初始密码均设为:123456
实验:
[root@localhost opt]# tail -5 /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
dings:x:1000:1000:dings:/home/dings:/bin/bash
wangwu:x:1001:1001::/home/wangwu:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
lisi:x:1002:1002::/home/lisi:/bin/bash
[root@localhost opt]# cat add.sh
#!/bin/bash
i=1
name="stu"
while [ $i -le 20 ]
do
useradd "$name$i"
echo "123456" | passwd --stdin $name$i
let i++
done
[root@localhost opt]# chmod +x add.sh
[root@localhost opt]# ./add.sh
[root@localhost opt]# tail -20 /etc/passwd
stu1:x:1003:1003::/home/stu1:/bin/bash
stu2:x:1004:1004::/home/stu2:/bin/bash
stu3:x:1005:1005::/home/stu3:/bin/bash
stu4:x:1006:1006::/home/stu4:/bin/bash
stu5:x:1007:1007::/home/stu5:/bin/bash
stu6:x:1008:1008::/home/stu6:/bin/bash
stu7:x:1009:1009::/home/stu7:/bin/bash
stu8:x:1010:1010::/home/stu8:/bin/bash
stu9:x:1011:1011::/home/stu9:/bin/bash
stu10:x:1012:1012::/home/stu10:/bin/bash
stu11:x:1013:1013::/home/stu11:/bin/bash
stu12:x:1014:1014::/home/stu12:/bin/bash
stu13:x:1015:1015::/home/stu13:/bin/bash
stu14:x:1016:1016::/home/stu14:/bin/bash
stu15:x:1017:1017::/home/stu15:/bin/bash
stu16:x:1018:1018::/home/stu16:/bin/bash
stu17:x:1019:1019::/home/stu17:/bin/bash
stu18:x:1020:1020::/home/stu18:/bin/bash
stu19:x:1021:1021::/home/stu19:/bin/bash
stu20:x:1022:1022::/home/stu20:/bin/bash
- 需求 2 :猜商品价格游戏
通过变量RANDOM获得随机数
提示用户猜测并记录次数,猜中后退出循环
实验:
[root@localhost opt]# cat jiage.sh
#!/bin/bash
num=$(expr $RANDOM % 1000)
list=0
echo "猜猜商品价格,范围是(0~999)"
while true
do
read -p "请输入您猜测的价格:" n
let list++
if [ $n -lt $num ] && [ $n -ge 0 ]
then
echo "小了"
elif [ $n -gt $num ] && [ $n -le 999 ]
then
echo "大了"
elif [ $n -eq $num ]
then
echo "恭喜您猜对了,您一共猜了$list次"
exit 0
else
echo "输入有误"
fi
done
[root@localhost opt]# chmod +x jiage.sh
[root@localhost opt]# ./jiage.sh
猜猜商品价格,范围是(0~999)
请输入您猜测的价格:200
小了
请输入您猜测的价格:1111
输入有误
请输入您猜测的价格:400
小了
请输入您猜测的价格:600
大了
请输入您猜测的价格:450
小了
请输入您猜测的价格:560
大了
请输入您猜测的价格:500
大了
请输入您猜测的价格:470
小了
请输入您猜测的价格:490
小了
请输入您猜测的价格:496
大了
请输入您猜测的价格:494
恭喜您猜对了,您一共猜了11次
总结:
1、在遇到一个需求时,首先关注需求中要达成的目的,然后思考达成目的需要哪些条件有哪些规律,接着我们确定这些条件中有哪些变量,这些变量我们如何去表示出来。
2、如果遇到需要双循环的需求,我们要注意循环之间的关系,明确脚本中声明变量或交互的信息的作用范围。