首页 > 系统相关 >【Linux入门】shell基础篇——while循环与until循环

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

时间:2024-08-28 12:57:40浏览次数:13  
标签:do shell sum echo while 循环 done

文章目录

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. 变量引用:在比较和赋值时,使用双引号将变量括起来,以避免由于变量未定义或为空而导致的潜在问题。

标签:do,shell,sum,echo,while,循环,done
From: https://blog.csdn.net/Karoku/article/details/141605414

相关文章

  • 【Shell脚本】监控 httpd 的进程数,根据监控情况做相应处理
    #!/bin/bash################################################################################################################################需求:#1.每隔10s监控httpd的进程数,若进程数大于等于500,则自动重启Apache服务,并检测服务是否重启成功#2.若未成功则需......
  • 【Shell脚本】批量修改服务器用户密码
    Linux主机SSH连接信息:旧密码#catold_pass.txt192.168.18.217root12345622192.168.18.218root12345622内容格式:IPUserPasswordPortSSH远程修改密码脚本:新密码随机生成#!/bin/bashOLD_INFO=old_pass.txtNEW_INFO=new_pass.txtfor......
  • 【Shell脚本】iptables 自动屏蔽访问网站频繁的IP
    场景恶意访问,安全防范1)屏蔽每分钟访问超过200的IP方法1:根据访问日志(Nginx为例)#!/bin/bashDATE=$(date+%d/%b/%Y:%H:%M)ABNORMAL_IP=$(tail-n5000access.log|grep$DATE|awk'{a[$1]++}END{for(iina)if(a[i]>100)printi}')#先tail防止文件过大,读取慢,数字可......
  • 【Shell脚本】根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
    #!/bin/bash#####################################################################################根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁####################################################################################lo......
  • 【Shell脚本】判断用户输入的是否为IP地址
    方法1:#!/bin/bashfunctioncheck_ip(){IP=$1VALID_CHECK=$(echo$IP|awk-F.'$1<=255&&$2<=255&&$3<=255&&$4<=255{print"yes"}')ifecho$IP|grep-E"^[0-9]{1,3}\.[0-9]{1,3}\......
  • 【Shell脚本】用户猜数字
    #!/bin/bash#脚本生成一个100以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,#猜小了或猜大了,直至用户猜对脚本结束。#RANDOM为系统自带的系统变量,值为0‐32767的随机数#使用取余算法将随机数变为1‐100的随机数num=$[RANDOM%100+1]echo"$n......
  • 【Shell脚本】批量修改文件名
    示例:#toucharticle_{1..3}.html#lsarticle_1.htmlarticle_2.htmlarticle_3.html把article改为bbs方法1:forfilein$(ls*html);domv$filebbs_${file#*_}#mv$file$(echo$file|sed-r's/.*(_.*)/bbs\1/')#mv$file$(ec......
  • 【Shell 脚本】检测两台服务器指定目录下的文件一致性
    #!/bin/bash######################################检测两台服务器指定目录下的文件一致性######################################通过对比两台服务器上文件的md5值,达到检测一致性的目的dir=/data/webb_ip=192.168.88.10#将指定目录下的文件全部遍历出来并......
  • 【Shell脚本】定时清空文件内容,定时记录文件大小
    #!/bin/bash#################################################################每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内#容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录......
  • 【Shell脚本】检测网卡流量,并按规定格式记录在日志中
    #!/bin/bash########################################################检测网卡流量,并按规定格式记录在日志中#规定一分钟记录一次#日志格式如下所示:#2019-08-1220:40#ens33input:1234bps#ens33output:1235bps######################################......