Shell 编程----循环语句之for&while

本文深入解析Shell脚本中的循环语句,包括for循环和while循环的结构、应用实例及常见用法,如批量添加用户、检查主机状态等,同时介绍了continue和break的使用区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shell 编程----循环语句

一:循环语句

1.1:for循环语句

1.1.1:for语句结构

  • 读取不同的变量值,用来逐个执行同一组命令

  • 语句结构
    for 变量名 in 取值列表
    do
    	命令序列
    done
    
    语句结构举例
    for 收件人 in 邮件地址列表
    do
    	发送邮件
    done
    

    mark

1.1.2:使用for批量添加用户

  • 用户名存放在users.txt文件中,每行一个

  • 初始密码均设为123456

  • [root@shell lpf]# cat users.txt 
    ljz
    ltc
    am
    xdf
    [root@shell lpf]# sh useradd.sh 
    更改用户 ljz 的密码 。
    passwd:所有的身份验证令牌已经成功更新。
    更改用户 ltc 的密码 。
    passwd:所有的身份验证令牌已经成功更新。
    更改用户 am 的密码 。
    passwd:所有的身份验证令牌已经成功更新。
    更改用户 xdf 的密码 。
    passwd:所有的身份验证令牌已经成功更新。
    [root@shell lpf]# cat useradd.sh
    #!/bin/bash
    #定义集合
     LIST=$(cat ./users.txt)
    #遍历创建用户
    for user in $LIST
    do
     #添加用户
     useradd $user
     #添加账户密码
     echo "123456" | passwd --stdin $user
    done 
    [root@shell lpf]# 
    
    
    • 脚本可以适当修改优化:如
      echo “123456” | passwd --stdin $bb &> /dev/null
    [root@shell lpf]# sh userdel.sh
     ljz 删除成功
     ltc 删除成功
     am 删除成功
     xdf 删除成功
    [root@shell lpf]# vim userdel.sh
    
    #!/bin/bash
    LIST=$(cat /lpf/users.txt)
    for user in $LIST
    do
      userdel -r $user
      echo " $user 删除成功"
    done
    
    

1.1.3:示例–根据IP地址检查主机状态

  • 检测IP地址192.168.197.0-192.168.197.10段落

  • 使用ping命令检测各主机的连通性

    
    [root@shell lpf]# vim pinghost.sh 
    [root@shell lpf]# sh pinghost.sh 
    Host 192.168.197.1 is down
    Host 192.168.197.2 is down
    Host 192.168.197.3 is down
    Host 192.168.197.4 is down
    Host 192.168.197.5 is down
    Host 192.168.197.6 is down
    Host 192.168.197.7 is down
    Host 192.168.197.8 is down
    Host 192.168.197.9 is down
    Host 192.168.197.10 is down
    [root@shell lpf]# vim pinghost.sh 
    
    #!/bin/bash
    for ((i=1;i<=10;i++))
    do
      ping -c 3 -i 0.2 -W 3 "192.168.197.$i" &> /dev/null
      if [ $? -eq 0 ]
            then
            echo "Host 192.168.197.$i is up"
      else
            echo "Host 192.168.197.$i is down"
      fi
    done
    ~    
    

1.1.4:用循环语句输出1-10的数字的四种办法

  • 方式一:

    #!/bin/bash
    for ((i=1;i<=10;i++))
    do
      echo "$i"
    done
    
  • 方式二:

    #!/bin/bash
    i=1
    for ((;i<=10;i++))
    do
      echo "$i"
    done
    
  • 方式三:

    #!/bin/bash
    i=1
    for ((;i<=10;))
    do
      echo "$i"
      let i++
    done
    
  • 方式四

    #!/bin/bash
    i=1
    for ((;;))
    do
      if [ $i -le 10 ]
            then
            echo "$i"
            let i++
      else
            exit 0
      fi
    done
    

1.1.5:shell中let命令

  • let 对整数进行数学运算

  • let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。

    语法格式
    let 表达式
    或
    let "表达式"let '表达式'
    
  • 当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号或者单引号将表达式包围起来。

  • 和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。

1.1.6:计算1-10偶数/奇数的和

  • 方式一:计算偶数的和

    [root@shell lpf]# sh oushu.sh 
    总和为30
    [root@shell lpf]# vim oushu.sh
    
    #!/bin/bash
    sum=0
    for ((i=2;i<=10;i=i+2))
    do
      let sum+=$i
    done
      echo "总和为$sum"
    
    
  • 方式一:计算奇数的和

  • #!/bin/bash
    sum=0
    for((i=1;i<=10;i+=2))
      do
            let sum+=$i
      done
            echo "总和为:$sum"
    
  • 方式二:求偶数和

    [root@shell lpf]# sh oushu.sh 
    总和为30
    [root@shell lpf]# vim oushu.sh 
    
    #!/bin/bash
    sum=0
    for ((i=2;i<=10;i=i+2))
    do
      if [ `expr $i % 2` -eq 0 ];then
      let sum+=$i
      fi
    done
      echo "总和为$sum"
    
    
  • 方式二:求奇数和

  • 
    [root@shell lpf]# sh oushu.sh 
    总和为25
    [root@shell lpf]# vim oushu.sh 
    
    #!/bin/bash
    sum=0
    for ((i=1;i<=10;i=i+2))
    do
      if [ `expr $i % 2` -eq 1 ];then
      let sum+=$i
      fi
    done
      echo "总和为$sum"
    

1.2:while循环语句

1.2.1:while语句结构

  • 重复测试某个条件,只要条件成立则反复执行

    
    语句结构
    while 条件测试操作
    do
    	命令序列
    done
    
    语句结构示例
    while 未猜中正确的价格
    do
    	反复猜测商品价格
    done
    

    mark

1.2.2:while语句应用示例

  • 使用while循环语句输出1-10数字

    #!/bin/bash
    i=0
    while [ $i -le 10 ]
    do
      echo "$i"
      let i++
    done
    
    [root@shell lpf]# . cccc.sh 
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    

1.2.3:while死循环

  • while true:死循环有时候也有奇效,可与用户交互

    [root@shell lpf]# vim sixunhuan.sh
    
    #!/bin/bash
     while true
     do
       read -p "请输入yes退出:" KEY
       if [ $KEY = yes ]
             then
               break
       fi
     done
     echo "正常退出"
     
    [root@shell lpf]# sh sixunhuan.sh 
    请输入yes退出:no
    请输入yes退出:no
    请输入yes退出:q
    请输入yes退出:f
    请输入yes退出:h
    请输入yes退出:^C
    
    

1.2.4:使用while批量添加用户

  • 用户名称以stu开头,按数字顺序进行编号

  • 一共添加20个用户,即stu1,stu2…stu20

  • 初始密码设置为123456

    #!/bin/bash
    i=0
    while [ $i -le 19 ]
    do
      let i++
      useradd stu$i
      echo "123456" | passwd --stdin stu$i &> /dev/null
      echo "stu$i添加成功"
    done
    echo "添加完毕"
    
      [root@shell lpf]# ./useradd.sh 
      stu1添加成功
      stu2添加成功
      stu3添加成功
      stu4添加成功
      stu5添加成功
      stu6添加成功
      stu7添加成功
      stu8添加成功
      stu9添加成功
      stu10添加成功
      stu11添加成功
      stu12添加成功
      stu13添加成功
      stu14添加成功
      stu15添加成功
      stu16添加成功
      stu17添加成功
      stu18添加成功
      stu19添加成功
      stu20添加成功
      添加完毕
    

1.2.5:总结

$( a ) 括号里加命令等于 反撇号

${ a } 括号里 加变量(这里的变量不用加刀了)与后面字符做分割

$[ a ] 括号里是表达式

(( a )) 等于 let a

[ a ] 等于test a

1.2.6:取出1-100不能被三整除的数

[root@shell lpf]# vim sanzhengchu.sh

#!/bin/bash
i=100
while [ $i -gt 0 ]
do
  if [ `expr $i % 3` -eq 0 ];then
    let i--
    continue
  else
    echo $i
  fi
  let i--
done
#或者
[root@shell lpf]# vim sanzhengchu.sh

#!/bin/bash
i=100
while [ $i -gt 0 ]
do
  if [ ! `expr $i % 3` -eq 0 ];then
    echo $i
    let i--
  else
    let i--
  fi
done

[root@shell lpf]# sh sanzhengchu.sh 
100
98
97
95
94
92
91
89
88
86
85
83
82
80
79
77
76
74
73
71
70
68
67
65
64
62
61
59
58
56
55
53
52
50
49
47
46
44
43
41
40
38
37
35
34
32
31
29
28
26
25
23
22
20
19
17
16
14
13
11
10
8
7
5
4
2
1


1.3:continue和break

1.3.1:continue

  • 命令格式
    continue n
    n 表示循环的层数:
    如果省略 n,则表示 continue 只对当前层次的循环语句有效,遇到 continue 会跳过本次循环,忽略本次循环的剩余代码,直接进入下一次循环。
    如果带上 n,比如 n 的值为 2,那么 continue 对内层和外层循环语句都有效,不但内层会跳过本次循环,外层也会跳过本次循环,其效果相当于内层循环和外层循环同时执行了不带 n 的 continue。这么说可能有点难以理解,稍后我们通过代码来演示。
    continue 关键字也通常和 if 语句一起使用,即满足条件时便跳出循环。 
    

mark

1.3.2:break

  • 命令格式
    break n
    n 表示跳出循环的层数,如果省略 n,则表示跳出当前的整个循环。
    break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
    

mark

.3.3:break和continue的区别

  • break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值