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

while循环与until循环

while循环

while循环的基本格式

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

示例:打印0到5的数字

#!/bin/bash
i=0
while [ $i -le 5 ]
do
    echo "$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 时退出循环
do
    echo $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 时执行循环
do
    sum=$((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 ]
do
    useradd stu$i 2>/dev/null
    if [ $? -eq 0 ]; then
        echo "123456" | passwd --stdin stu$i &>/dev/null
        if [ $? -eq 0 ]; then
            echo "用户 stu$i 被建立并设置密码"
        else
            echo "用户 stu$i 密码设置失败"
        fi
    else
        echo "用户 stu$i 建立失败"
    fi
    let i++
done

批量删除用户

#!/bin/bash
i=0
while [ "$i" -le 20 ]
do
    if userdel -r stu$i; then
        echo "用户 stu$i 已被删除"
    else
        echo "删除用户 stu$i 失败"
    fi
    let i++
done

猜价格游戏

#!/bin/bash
p=$((RANDOM % 1000 + 1))
t=1

while true
do
    read -p "请输入商品的价格1-1000: " num
    let t++
    if [ "$num" -eq "$p" ]; then
        echo "恭喜你猜中了,实际价格是$p"
        echo "您一共猜了$t次"
        break
    elif [ "$num" -gt "$p" ]; then
        echo "您猜的价格高了"
    else
        echo "您猜的价格低了"
    fi
done

密码输入验证

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

说明

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值