当前位置: 首页 > news >正文

【Linux入门】shell基础篇——while循环与until循环

文章目录

  • while循环与until循环
    • while循环
      • while循环的基本格式
      • 示例:打印0到5的数字
      • 死循环的几种实现方式
      • 注意
      • 退出循环
    • until循环、与while循环的区别
      • until 循环示例
      • while 循环方式
      • 注意
    • 有趣的实例
      • 批量建立用户
      • 批量删除用户
      • 猜价格游戏
      • 密码输入验证
      • 说明

while循环与until循环

while循环

while循环的基本格式

while [ 判断条件 ]
do执行动作
done
  • 判断条件:这是一个返回真(0)或假(非0)的表达式。如果条件为真,则执行dodone之间的命令;如果条件为假,则跳过这些命令,继续执行done之后的命令。
  • 执行动作:这是当判断条件为真时要执行的命令或命令序列。
  • done:这标志着while循环的结束。

示例:打印0到5的数字

#!/bin/bash
i=0
while [ $i -le 5 ]
doecho "$i"let i++
done

死循环的几种实现方式

死循环是指循环条件永远为真,导致循环体内的命令无限次执行。

  1. 使用固定为真的条件
    while [ 1 -eq 1 ]
    do# 执行命令
    done
    
  2. 使用true命令
    true是一个总是返回真(0)的命令,因此可以直接用作while循环的条件。
    while true
    do# 执行命令
    done
    
  3. 使用冒号(:
    冒号(:)是一个空命令,它等价于true,也常用于创建死循环。
    while :
    do# 执行命令
    done
    

注意

  • 在使用while循环时,确保循环条件最终会变为假,以避免无限循环。
  • 如果需要在循环内部改变循环条件,确保这些改变是有效的,并且确实能够影响循环的继续执行。
  • 在编写死循环时,通常需要在循环体内添加某种形式的退出条件(如使用break语句),以便在需要时能够退出循环。

退出循环

  • break:用于立即退出循环。
  • continue:用于跳过当前循环的剩余部分,直接开始下一次循环的迭代(如果条件仍然为真)。
  • 修改循环条件:通过修改循环条件使其变为假,从而自然退出循环。

until循环、与while循环的区别

until 循环确实是一种在条件不满足时持续执行循环体,直到条件满足时退出循环的控制结构。它与 while 循环相反,while 循环是在条件满足时执行循环体。

until 循环示例

首先,我们来看 until 循环的示例:

#!/bin/bash
i=0
sum=0
until [ $i -gt 10 ]  # 当 $i 大于 10 时退出循环
doecho $i          # 打印当前的 $i 值let i++          # $i 自增sum=$(($sum+$i)) # 将 $i 的值加到 $sum 上
done
echo "Sum: $sum"     # 循环结束后打印总和

在这个脚本中,until 循环会一直执行,直到 $i 的值大于 10。每次循环都会打印当前的 $i 值,将其加到 $sum 上,并将 $i 自增。循环结束后,会打印出 $sum 的值。

while 循环方式

接下来,我们看一个 while 循环的示例,该示例计算从 0 到 100(包括 100)的整数和:

#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]  # 当 $i 小于或等于 100 时执行循环
dosum=$((sum+i))    # 将 $i 的值加到 $sum 上,注意这里使用了更现代的算术扩展语法let i++           # $i 自增
done
echo "Sum: $sum"      # 循环结束后打印总和

在这个脚本中,while 循环会一直执行,直到 $i 的值大于 100。每次循环都会将 $i 的值加到 $sum 上,并将 $i 自增。循环结束后,会打印出 $sum 的值。

注意

  • 在 Bash 脚本中,算术扩展通常使用 $((expression)) 语法,它比旧的 $[expression] 语法更现代、更灵活。
  • untilwhile 循环中,确保循环条件最终会改变,以避免无限循环。
  • let 命令中,变量名前不需要加 $ 符号,但在算术扩展或赋值操作中通常需要。
  • 脚本开头应使用 #!/bin/bash 来指定解释器,以确保脚本在 Bash 环境中执行。

有趣的实例

批量建立用户

#!/bin/bash
i=0
while [ "$i" -le 20 ]
douseradd stu$i 2>/dev/nullif [ $? -eq 0 ]; thenecho "123456" | passwd --stdin stu$i &>/dev/nullif [ $? -eq 0 ]; thenecho "用户 stu$i 被建立并设置密码"elseecho "用户 stu$i 密码设置失败"fielseecho "用户 stu$i 建立失败"filet i++
done

批量删除用户

#!/bin/bash
i=0
while [ "$i" -le 20 ]
doif userdel -r stu$i; thenecho "用户 stu$i 已被删除"elseecho "删除用户 stu$i 失败"filet i++
done

猜价格游戏

#!/bin/bash
p=$((RANDOM % 1000 + 1))
t=1while true
doread -p "请输入商品的价格1-1000: " numlet t++if [ "$num" -eq "$p" ]; thenecho "恭喜你猜中了,实际价格是$p"echo "您一共猜了$t次"breakelif [ "$num" -gt "$p" ]; thenecho "您猜的价格高了"elseecho "您猜的价格低了"fi
done

密码输入验证

#!/bin/bash
i=1
psd="123456"
while [ "$i" -le 3 ]; doread -p "请输入验证密码:" keyif [ "$key" = "$psd" ]; thenecho "密码输入正确!"exit 0elseecho "输入错误!"let i++fi
done
echo "密码输入错误次数超过三次!已经锁定!"
exit 1

说明

  1. 错误处理:在useradduserdel命令后添加了错误检查,以便在出现错误时给出适当的反馈。
  2. 密码设置:在批量建立用户的脚本中,如果useradd成功,则尝试设置密码,并检查passwd命令的返回值。
  3. 逻辑优化:在密码输入验证脚本中,如果密码正确,则直接退出脚本;如果连续三次错误,则输出锁定信息并退出脚本。
  4. 变量引用:在比较和赋值时,使用双引号将变量括起来,以避免由于变量未定义或为空而导致的潜在问题。

http://www.mrgr.cn/news/12514.html

相关文章:

  • 简易的 Websocket + 心跳机制 + 尝试重连
  • 全国首个高速公路5G-A通感一体基站在宁开通测试
  • Mysql的命令大全
  • 【附源码】Python :三棱柱建模
  • JVM经典的垃圾收集器
  • 自动化编译项目:使用 Bash 脚本与 CMake
  • 游戏开发中的打砖块反弹(godot)
  • 自动化刷题小练习
  • pytorch Dataset类代码学习
  • 牛客小白月赛99部分题解
  • 分布式系统
  • SpringBoot项目整合智谱AI + SSE推送流式数据到前端展示 + RxJava得浅显理解
  • WIFI驱动开发
  • 金融工程--基于akshare的数据获取
  • P1088 [NOIP2004 普及组] 火星人
  • Java | Leetcode Java题解之第376题摆动序列
  • MYSQL 优化
  • git安装及常用命令
  • asp.net core在win上的发布和部署
  • 若依,前后端分离项目,部署到服务器