// Linux · 2024-11-24

Shell脚本基础:循环结构

@[TOC](内容预览 ≧∀≦ゞ

在 Shell 脚本中,循环是实现自动化任务的核心工具。它能够批量处理数据、执行重复性操作,从而提高效率。常见的循环结构包括 for、while 和 until。本篇将通过示例详解这些循环结构的用法、适用场景,以及它们之间的区别,帮助大家更灵活地使用循环控制逻辑。


一、for 循环

for 循环适用于遍历已知范围的列表或序列,是处理固定数据的首选。

示例 1:遍历指定值列表

# 遍历一个固定的值列表
for num in 1 2 3 4 5
do
    echo "当前数字是 $num"
done

用法解析:

  • 循环变量 num 每次取列表中的一个值,直到取完所有值为止。
  • 以上代码输出:
    当前数字是 1
    当前数字是 2
    当前数字是 3
    当前数字是 4
    当前数字是 5

适用场景:

  • 当需要处理一组固定的元素(如文件名、参数列表)时非常实用。

示例 2:单次循环一个字符串

# 遍历一个字符串
for str in "hello world"
do
    echo "字符串内容:$str"
done

用法解析:

  • 由于 "hello world" 是一个整体,整个字符串被当作单个元素,因此只循环一次。
  • 输出:
    字符串内容:hello world

扩展说明:

  • 若没有使用引号,则会将空格分隔的内容视为多个元素:
    for word in hello world
    do
        echo $word
    done
    输出为:
    hello
    world

示例 3:使用 seq 生成数字序列

# 打印 1 到 100
for i in $(seq 1 100)
do
    echo $i
done

用法解析:

  • seq 1 100 生成一个从 1 到 100 的数字序列,$() 负责将序列结果传递给 for。
  • 输出结果为 1 到 100 的所有数字。

适用场景:

  • 当需要循环固定范围的数字时,seq 提供了简洁的实现方式。

示例 4:C 风格双括号语法

# 打印 1 到 99
for ((i=1; i<100; i++))
do
    echo $i
done

用法解析:

  • 双括号语法与 C 语言风格类似:for ((初始化; 条件; 递增))。
  • 更适合需要复杂逻辑控制的场景,例如动态设置初始值或步长。

区别:

  • seq 提前生成整个数字列表,效率较低;而双括号语法直接控制变量变化,不生成额外数据,性能更优。

二、while 循环

while 循环在条件为真时重复执行代码块,适合处理未知循环次数的场景。

示例 1:输出 1 到 10

# 初始化变量
i=1
# 条件循环
while ((i <= 10))
do
    echo $i
    ((i++))  # 自增 1
done

用法解析:

  • while 循环从 i=1 开始,每次检查条件 i <= 10 是否满足。
  • 输出结果为:
    1
    2
    ...
    10

示例 2:避免死循环

# 示例死循环(逻辑错误)
i=100
while ((i >= 10))
do
    echo $i
    ((i++))  # 不断递增,条件永远成立
done

问题解析:

  • 由于自增操作 (i++) 导致 i 无限增长,条件 (i >= 10) 永远为真,形成死循环。

改进方案:

  • 确保条件能够正确触发循环退出,例如:
    while ((i <= 100))

示例 3:结合 let 命令进行自增

# 输出 1 到 10
i=1
while ((i <= 10))
do
    echo $i
    let "i++"  # 使用 let 命令
done

区别说明:

  • let 和 (( )) 均可用于算术运算,效果相同,但 let 更适合单独的运算操作。

示例 4:输出从 10 到 100

# 输出从 10 到 100
i=10
while ((i <= 100))
do
    echo $i
    let "i++"
done

用法解析:

  • 通过设置初始值 i=10 和条件 i <= 100,实现自定义范围的循环输出。

三、until 循环

until 循环的逻辑与 while 相反:在条件为假时执行循环。

示例 1:输出 1 到 9

# 初始化变量
i=1
# 直到 i 不小于 10 时结束循环
until [ $i -ge 10 ]
do
    echo $i
    ((i++))
done

用法解析:

  • 条件 [ $i -ge 10 ] 表示当 i >= 10 时退出循环;在此之前,循环体会持续执行。
  • 输出结果为:
    1
    2
    ...
    9

适用场景:

  • 当问题逻辑更自然地表达为“直到满足某条件时停止”时,until 是更优选择。

四、循环对比总结

循环类型 逻辑 适用场景
for 遍历列表 已知范围或固定数量的操作,例如文件列表、数字序列等。
while 条件为真 处理动态范围或未知次数的循环,例如用户输入、实时监控等。
until 条件为假 在特定条件达成之前重复执行,例如检查进程完成状态、检测文件生成等。

以上是 Shell 脚本中三种循环结构的详细用法。通过示例代码与解析,相信大家对 for、while 和 until 的特点有了更深入的理解。在编写脚本时,灵活选择适合的循环结构,可以让代码更简洁、高效!

最后,再次感谢您阅读本篇文章,如果您对文中内容有任何疑问或建议,欢迎在评论区与我交流!您的点赞和分享将是我继续创作的动力。

原文 https://blog.csdn.net/2301_79518550/article/details/143985241