shell(4)--shell脚本中的循环:(if循环,for,while,until)和退出循环(continue,break, exit)

文章目录

文章内容主要包括:if简单循环和嵌套循环,for简单循环和嵌套循环,while简单循环和嵌套循环,until循环以及部分示例;退出循环的语句:continue跳过本次循环,break退出循环,exit退出循环带状态码及其部分的示例。

if语句

if语句是一种条件控制结构,用于根据特定条件的真假决定是否执行某段代码。条件通常是一个布尔表达式,结果为true或false。

判断条件执行流程:

当程序执行到if语句时,会先计算括号内的条件表达式。

如果条件为true,则执行if后的代码块(花括号{}内的内容)。

如果条件为false,则跳过该代码块,继续执行后续语句。

扩展结构:else和else if

  • else:当if条件为false时,执行else后的代码块。
  • else if:用于链式判断多个条件,按顺序检查直到某个条件为true。

单分支 if 语句

shell 复制代码
if [ 条件测试操作 ]
then
命令序列
fi

双分支 if 语句

shell 复制代码
if  [  条件测试操作  ]
  then
                 命令序列 1
   else
                命令序列 2
fi

2. if -then-elif-else-fi多分支

else if -->elif

shell 复制代码
if 条件测试
  then
         执行命令
   elif 条件测试
        then
                 执行命令
   elif 条件测试
        then
                 执行命令
else
 fi

3. if嵌套

shell 复制代码
if 条件测试
  then
         执行命令
         if 条件测试
             then
                      执行命令
             else
          fi
else
 fi

for循环语句

在for循环结构中:

  1. 基本语法格式:
bash 复制代码
for 变量名 in 列表值
do
    # 循环体语句
done
  • 变量名不需要加$符号声明
  • do关键字标记循环体的开始
  • done关键字标记循环体的结束
  1. 执行特点:
  • 循环会遍历列表中的所有元素
  • 每次迭代将当前列表元素赋值给循环变量
  • 必须处理完列表中所有元素才会退出循环
  • 不能中途使用break跳出(除非特别声明)
  1. 示例应用场景:
bash 复制代码
# 遍历当前目录下的.txt文件
for file in *.txt
do
    echo "正在处理文件: $file"
    wc -l $file
done

# 遍历数字序列
for i in {1..5}
do
    echo "第$i次循环"
done

# 遍历命令输出结果
for user in $(cat /etc/passwd | cut -d: -f1)
do
    echo "系统用户: $user"
done
  1. 注意事项:
  • 列表可以是:显式列表、命令输出、文件名通配、数字序列等
  • 循环变量只在循环体内有效
  • 缩进不是必须的,但能提高可读性
  • 在循环体内引用变量时需要加$符号

简单for循环

shell 复制代码
for [变量名1] in  [取值列表]
do
    执行语句
done

嵌套for循环基本语法结构

shell 复制代码
# 外层循环代码

for 外层变量 in 序列; do
    # 内层循环代码
    for 内层变量 in 序列; do
    done
done
  1. 两次for嵌套
shell 复制代码
 for [变量名1] in  [取值列表]
do
     for [变量名2] in  [取值列表]
     do
           执行语句
      done
done

示例:99乘法表

shell 复制代码
#!/bin/bash
# 生成九九乘法表

echo "=== 九九乘法表 ==="

for i in {1..9}; do
    for j in {1..9}; do
        if [ $j -le $i ]; then
            result=$((i * j))
            printf "%d×%d=%-2d " $j $i $result
        fi
    done
    echo
done
  1. 类似C语言的
shell 复制代码
for (( 表达式1;表达式2;表达式3 ))
do
    执行语句
done

嵌套

shell 复制代码
for (( 表达式1;表达式2;表达式3 ))
do
    执行语句
         for (( 表达式4;表达式5;表达式6 ))
         do
              执行语句
         done
done
shell 复制代码
#!/bin/bash
#制作一个99乘法表

echo "--------------九九乘法表--------------"
for ((i=1;i<=9;i++))
do
  for ((j=1;j<=i;j++))
  do
    num=$((j*i))
    echo -n "${j}*${i}=${num} "
  done
  echo
done
  1. for语句里嵌套if语句
bash 复制代码
for 变量 in 可迭代对象:
    if 条件表达式:
        # 条件成立时执行的代码块

示例:

shell 复制代码
#!/bin/bash
#求0到50的奇偶和
#偶数和
sum3=0
#奇数和
sum4=0

for ((i=0;i<=50;i++))
do
  a=$(($i%2))
  if [ $a -eq 0 ]
    then
      sum3=$(( $i + $sum3 ))
  else
      sum4=$(( $i + $sum4 ))
  fi
done
echo "0到50偶数和:$sum3"
echo "0到50奇数和:$sum4"

简单总结:

for 变量名 in 表达式 (①作为变量名的变量值遍历赋值②控制for循环的次数)

do

执行指令

done

while循环语句

while循环是一种在满足特定条件时重复执行代码块的循环结构。

当while后的条件成立时,执行循环体内的代码

python 复制代码
while condition:
    # 循环体代码
 

执行逻辑解析

条件检查:程序首先评估condition(布尔表达式)。若结果为True,进入循环体;若为False,跳过循环。

循环体执行:执行循环体内的代码,完成后再次检查条件。

重复过程:上述步骤重复,直到条件变为False时终止循环。

需要注意条件逻辑,避免进入死循环。

while循环语句的格式:

#不带条件的

bash 复制代码
while true
do
  #循环代码体
  执行任务
done

#带条件的

bash 复制代码
while [条件判断(--ture)]
do
  #循环代码体
  执行任务
done
或
while [条件判断(--ture)];do
  #循环代码体
  执行任务
done
while循环结束标志 while true

示例:

shell 复制代码
#!/bin/bash
# 用户输入验证循环

while true; do
    read -p "请输入用户名 (至少3个字符): " username
    
    # 检查用户名长度
    if [ ${#username} -lt 3 ]; then
        echo "错误:用户名太短!"
        continue
    fi
    
    # 检查是否只包含字母数字
    if [[ ! "$username" =~ ^[a-zA-Z0-9]+$ ]]; then
        echo "错误:用户名只能包含字母和数字!"
        continue
    fi
    
    echo "✅ 用户名有效: $username"
    break
done

# 基础数字循环
#当count小于等于5的时候,执行计数
count=1
while [ $count -le 5 ]
do
    echo "当前计数: $count"
    count=$((count + 1))
done

实验:

猜价格游戏

使用循环语句写shell

需求:

1、使用RANDOM 随机一个1~100的数字

2、和用户进行交互,当前已随机出一个1~100的数字,猜猜看是几?

3、如果用户猜大了,提示,你猜的数字大了

如果用户猜小了,提示,你猜的数字小了

如果用户猜对了,提示,恭喜猜对了,随机数是x,你一共猜了x次!

其他:输入有误

shell 复制代码
#!/bin/bash
#变量i统计猜的次数
i=0
#生成一个随机数num1
num1=$(($RANDOM % 100 + 1))

while true
do
 #let i++,每猜测一次,计一次
 let i++
 read -p "请输入你猜的数字(0~100):" num2
 #
 [[ ! ${num2} =~ ^[0-9]+$ ]] || [ ${num2} -lt 0 ] || [ ${num2} -gt 100 ] && echo "提示,你的输入有误" && let i-- && continue
 [ ${num1} -lt ${num2} ] && echo "提示,你猜的数大了"
 [ ${num1} -gt ${num2} ] && echo "提示,你猜的数小了"
 [ ${num1} -eq ${num2} ] && echo "提示,恭喜猜对了,随机数是${num1},你一共猜了${i}次" && break

done
echo "游戏结束"
猜随机数
shell 复制代码
#!/bin/bash
#case完成
#计次数
count=0
#随机数
a=$(($RANDOM % 100 + 1))

while true
  do
    let count++
    read -p "请输入你猜的数字(0~100):" b
    [ ${a} -lt ${b} ] && ch="more"
    [ ${a} -gt ${b} ] && ch="less"
    [ ${a} -eq ${b} ] && ch="eq"

    
    case ${ch} in
      more)
           echo "提示,你猜的数大了"
           ;;
      less)
           echo "提示,你猜的数小了"
           ;;
      eq)
         echo "提示,恭喜猜对了,随机数是${a},你一共猜了${count}次"
         exit 0
         ;;
      *)
        echo "输入有误,请重新输入"
        let count--
        ;;
     esac
done

另一种表达大小的方法

shell 复制代码
#!/bin/bash
#猜数字
n1=$(($RANDOM % 100 + 1))
i=0
while true
do
   let i++
   read -p "请输入你猜测随机生成数为多少(0-100):" n2
   #"-*"表示负数,"*"表示正数
   n3=$[n2-n1]
   case ${n3} in
    0)
      echo "提示,恭喜猜对了,随机数是${n1},你一共猜了${i}次"
      exit 0
      ;;
   -*)
       echo "提示,你猜的数小了"
       ;;
    *)
       echo "提示,你猜的数大了"
       ;;
   esac
done
批量管理用户
shell 复制代码
#!/bin/bash
i=0
while [ "${i}" -le 20 ]
do
  useradd stu${i}
  echo "123456" | passwd --stdin stu${i} &>/dev/full
  if [ $? -eq 0 ]
  then
      echo "用户 stu${i} 被建立"
  else
      echo "用户 stu${i} 建立失败"
  fi
  let i++
done


i=0
while [ "${i}" -le 20 ]
do
userdel -r stu${i}
let i++
done

while循环的关键要点:

  1. 条件检查:在每次迭代前检查条件
  2. 灵活的条件:可以是测试命令、其他命令的退出状态
  3. 循环控制:使用 break 和 continue 控制流程
  4. 无限循环:while true 或 while :
  5. 读取输入:与 read 命令配合处理用户输入
    适用场景:
    ● 用户输入验证
    ● 服务状态监控
    ● 文件内容处理
    ● 资源监控
    ● 定时任务执行
    ● 不确定次数的循环任务
    最佳实践:
  6. 总是设置退出条件,避免无限循环
  7. 在循环内处理错误情况
  8. 对于长时间运行的循环,添加适当的延迟
  9. 使用局部变量避免污染全局命名空间
  10. 在条件中使用简单的测试,避免昂贵操作
    while死循环
    死循环语句
shell 复制代码
while  [1  -eq  1]   判断条件写一个永久为真的条件 
   do       一直执行do内的命令
done

小知识:

  1. 两种写法
    while true 直接写判断条件为真
    do 一直执行do内的命令
    done

while : 判断条件为冒号也表示死循环

do 一直执行do内的命令

done

  1. 与for循环的区别

while循环适用于不确定迭代次数的场景(如用户输入验证),而for循环更适合遍历已知序列(如列表、字符串)。

未完待更...

相关推荐
星释2 小时前
Rust 练习册 :掌握文本处理与词频统计
开发语言·后端·rust
火龙谷2 小时前
DrissionPage遇到iframe
开发语言·前端·javascript
HalvmånEver2 小时前
Linux的第二章 : 基础的指令(二)
linux·运维·服务器·开发语言·学习
egoist20232 小时前
[linux仓库]线程同步与生产者消费者模型[线程·陆]
linux·c语言·开发语言·线程同步·阻塞队列·生产者消费者模型
资深web全栈开发4 小时前
[特殊字符]图解 Golang 反射机制:从底层原理看动态类型的秘密
开发语言·后端·golang
独隅9 小时前
在 Lua 中,你可以使用 `os.date()` 函数轻松地将时间戳转换为格式化的时间字符串
开发语言·lua
思麟呀10 小时前
Linux的基础IO流
linux·运维·服务器·开发语言·c++
星释10 小时前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释10 小时前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust