You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Bash脚本中的for循环先重复执行第一次迭代再执行第二次?

Bash脚本执行异常问题排查

我编写了一段Bash脚本,用于按顺序运行~/python目录下的test_01.py和test_02.py,预期执行流程为:

  1. 导航到~/python
  2. 运行test_01.py
  3. 运行test_02.py
  4. 返回~/bash

但实际执行时,脚本会先运行两次test_01.py,之后才运行test_02.py。使用的环境是WSL中的Ubuntu终端。脚本代码如下:

#! usr/bin/env bash
# test bash script to call python scripts

cd ~/python
for ((i = 1; i <= 2; i++)); do
 python3 test_0$i.py; done
cd ~/bash

其中test_01.py是单条打印语句,test_02.py包含一个for循环。


问题出在代码本身,不是Shell特性

你的脚本存在两处关键错误,导致执行行为异常:

  1. Shebang路径错误
    脚本首行的#! usr/bin/env bash漏了开头的斜杠,正确写法是#!/usr/bin/env bash。这个错误会让系统找不到bash解释器,转而用默认的sh(Ubuntu默认是dash)运行脚本。而dash不支持for ((i=1; i<=2; i++))这种C风格循环,直接导致循环逻辑混乱。

  2. Windows换行符干扰(WSL环境常见坑)
    如果脚本是在Windows下编辑的,换行符大概率是CRLF(\r\n),而Linux系统用的是LF(\n)。bash解析时会把\r当成文件名的一部分,比如test_0$i.py会被解析成test_01\r.py——这个文件不存在,bash就会匹配目录里现有的test_01.py执行,导致循环两次都跑同一个脚本。

另外,把done和python3命令挤在同一行虽然语法合法,但可读性差,也容易隐藏问题,建议分开写:

for ((i = 1; i <= 2; i++)); do
    python3 "test_0$i.py"
done

修复后的完整脚本

#!/usr/bin/env bash
# test bash script to call python scripts

# 目录切换失败直接退出,避免后续命令跑错地方
cd ~/python || exit
for ((i = 1; i <= 2; i++)); do
    python3 "test_0$i.py"
done
cd ~/bash || exit

额外提醒

  • 尽量在Linux环境下写脚本,或者用VS Code这类编辑器把换行符设为LF。
  • 给带变量的文件名加双引号,防止文件名有空格或特殊字符时出问题。
  • cd命令后加|| exit是个好习惯,避免目录不存在时白跑后续命令。

内容的提问来源于stack exchange,提问作者Girish Manjunath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:23:15