Shell编程之case循环、for循环及while循环理论与实例

前言:

除了我们之前讲述的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、如果遇到需要双循环的需求,我们要注意循环之间的关系,明确脚本中声明变量或交互的信息的作用范围。

发布了48 篇原创文章 · 获赞 46 · 访问量 6620

猜你喜欢

转载自blog.csdn.net/weixin_45726050/article/details/103329386
今日推荐