shell编程的三种循环(for,while,until)详解,及其应用案例思路分析

时间:2020-8-23 作者:admin


目录

一. for循环

1.1 for循环的语法格式

1.11 列表循环

列表for循环:用于将一组命令执行已知的次数
基本语法格式:

for value in {list}
  do
    command
    command
  done
  
或者
for value in a b c 
  do 
    command1
    command2
  done
 

注意事项:
在这里插入图片描述

在这里插入图片描述

1.12 类C风格的for循环

基本语法结构

for ((expr1;expr2;expr3))
do
  command
done
例:
for ((i=1;i<=6;i++))
do
  echo $i
done

说明:
expr1:定义变量并赋予初始值
expr2:判定循环的条件
expr3:变量的迭代规则

1.3 for循环的流程结构图

在这里插入图片描述

1.4 循环控制语句(continue,break,exit)

-循环体:do…done之间的内容continue:继续;
-continue表示循环体内下面的代码不执行,重新开始下一次循环
-break:打断;马上停止执行本次循环,执行循环体后面的代码
-exit:表示直接跳出程序

1.5 for循环的应用案例

1.51 脚本计算1-100的基数和

1.需求

计算1-100的奇数和

2.思路

1)定义一个变量来保存基数的和 sum=0
2)找出1-100的奇数,保存到另外一个变量里 i=遍历出来的期数
3)从1-100中找出奇数后,再相加,然后赋给变量
4)遍历完毕后,将sum的值打印出来

3.落地实现

方法一
#!/bin/bash
#计算1-100的奇数和
#定义变量保存奇数和
sum=0
#for 循环遍历1-100的奇数,并且相加,把结果重新赋值给sum
for i in {1..100..2}
do 
let sum=$sum+$i
done
#打印出所有奇数和
echo “1-100的奇数和为$sum“

方法二
sum=0
for ((i=1;i<=100;i+=2))
do
  sum=$[$sum + $i]
done
echo "1-100的奇数和为$sum"

1.52 批量创建用户

1.需求

批量加5个新用户,以U1到U5命名,并统一加到一个新组,组名为class,统一改密码为123456

2.思路

1)添加用户的命令 useradd -G calss
2) 判断class组是否存在
3)根据题意,判断该脚本循环5次来添加新用户
4)给用户设置密码应该放到循环体中

3.落地实现

#!/bin/bash
#判断class组是否存在
grep -w ^class /etc/group &> /dev/null
test $? -ne 0 && groupadd class
#循环创建用户
for ((i=1;i<=5;i++))
do 
 useradd -G class U$i > /dev/null
echo 123 | passwd --stdin U$i > /dev/null
done

1.53 局域网内脚本检查主机网络通讯

1.需求:

写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里,以10.1.1.1-10.1.1.10

2.落地实现

#!/bin/bash
#定义变量
ip=10.1.1
#循环去ping主机的IP
for i  in {1..10}
do
  ping -c 3 $ip.$i &> /dev/null
  if [ $? -eq 0 ];then
  echo "$ip.$i is ok" > /opt/ip_up.txt
  else
  echo "$ip.$i is down" > /opt/ip_down.txt
  fi
 done

二. while循环语句

特点:条件为真就进入循环,条件为假就退出循环

2.1 while 循环语法格式

1.while循环的语法格式

while 表达式
  do
  command
  done
while [ 1 -eq 1 ] 或者(( 1 = 1 ))
  do
    command
    command
  done

2.2 while循环的应用实例

2.21 while循环脚本同步时间

1.具体需求

1.写一个脚本,30秒同步一次系统时间,时间同步服务器为ntp1.aliyun.com
2.如果同步失败,则进行邮件报警,每次失败都报警
3.同步成功,也进行邮件通知,但是成功100次才通知一次

2.思路

1.每隔30秒同步一次时间,改脚本是一个死循环
2.同步失败发送邮件(ntpdate 20.0.0.26;rate -s 20.0.0.26)
3.同步成功100次发送邮件(定义一个变量保存成功的次数)

3.实现脚本

#!/bin/bash
#改脚本用于时间同步
NTP=ntp1.aliyun.com
count=0
while true
do
  ntpdate $NTP &> /dev/null
  if [ $? -ne 0 ];then
    echo "系统同步时间失败" | mail -s "需要检查系统同步时间" root@localhost
  else
   let count++
     if [ $count -eq 100 ];then
       echo "时间同步成功" | mail -s "时间同步没有问题" root@localhost
     fi
  fi
sleep 30
done  

三. until语句结构

特点:重复测试某个条件,只要条件不成立则反复执行

3.1 until语句的语法格式

until 条件测试操作
do
  命令序列
done

3.2 until语法结构流程图

在这里插入图片描述

3.3 until语句的应用实例

1.具体需求

1)使用until语句批量创建10个用户,要求stu1-stu5用户的UID分别为1001-1005;
2)stu6-stu10用户的家目录分别在/rhome/stu6-/rhome/stu10

2.思路

1)创建用户语句:useradd -u | useradd -d
2)使用循环语句(until)批量创建用户
3)判断用户前5个和后5个,条件判断语句

3.落地实现

if [ -d /rhome ];then
  echo "/rhome目录已存在"
else
  mkdir /rhome && echo "/rhome不存在,已完成创建"
fi
i=1 
until [ $i -gt 5 ]
do
  useradd stu$i -u $[1000+$i]
  echo 123 | passwd --stdin stu$i
  let i++
done
until [ $i -gt 10 ]
do
  useradd stu$i -d /rhome/stu$i
  echo 123 | passwd --stdin stu$i
  let i++
done
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。