Linux循环怎么写_Shell循环教程

4次阅读

linux shell循环forwhile、until三种,最常用for和while;for适用于已知次数的遍历,while适用于条件为真时重复执行,until适用于条件为假时重复执行。

Linux循环怎么写_Shell循环教程

Linux Shell 中的循环主要有 forwhileuntil 三种,最常用的是 forwhile。写对循环关键在结构清晰、条件明确、避免死循环。

for 循环:遍历列表或范围

适合已知次数或明确要处理的项目(如文件、数字、字符串)。

  • 基本语法:
      for 变量 in 列表; do
        命令序列
      done
  • 常见用法举例:
    • 遍历当前目录下所有 .txt 文件:
      for file in *.txt; do echo “处理: $file”; done
    • 遍历数字 1 到 5:
      for i in {1..5}; do echo $i; done
    • 用 seq 命令生成范围(兼容老版本 Shell):
      for i in $(seq 1 2 10); do echo $i; done  # 输出 1 3 5 7 9

while 循环:条件为真时重复执行

适合不确定执行次数、依赖状态变化的场景(如等待文件出现、读取输入、监控进程)。

  • 基本语法:
      while [ 条件 ]; do
        命令序列
      done
  • 关键点:
    • 条件必须能被更新,否则会陷入死循环;
    • 常用测试命令:[ -f file ](文件存在)、[ $n -lt 10 ](数值比较)、ps | grep xxx(进程检查);
    • 示例:每秒检查 /tmp/ready 文件是否存在,最多等 30 秒:
      n=0
      while [ ! -f /tmp/ready ] && [ $n -lt 30 ]; do
        sleep 1
        n=$((n + 1))
      done

until 循环:条件为假时重复执行

逻辑和 while 相反,适合“直到某事发生才停止”的情况,语义更直接。

  • 基本语法:
      until [ 条件 ]; do
        命令序列
      done
  • 上面的等待示例改用 until 更简洁:
      n=0
      until [ -f /tmp/ready ] || [ $n -eq 30 ]; do
        sleep 1
        n=$((n + 1))
      done

    (意思是:直到文件存在 或 超过 30 秒,就退出循环)

实用技巧与避坑提醒

  • 循环体内修改变量时,注意作用域:Shell 中 for/while 内部变量默认全局有效,无需额外声明;
  • break 提前退出循环,continue 跳过本次剩余操作、进入下一次;
  • 调试时加 echo 打印变量值,比如 echo "当前 i=$i"
  • 避免空列表导致 for 循环不执行(如 for f in $(ls *.log 2>/dev/NULL); do ...),可用 shopt -s nullglob 或先判断通配结果;
  • while 读文件建议用重定向而非管道,防止子 shell 导致变量失效:
      while IFS= read -r line; do
        echo “$line”
      done (✅ 正确)
      cat input.txt | while read line; do … done(❌ 变量在子 shell 中,外部不可见)
text=ZqhQzanResources