为何Bash脚本中的for循环先重复执行第一次迭代再执行第二次?
Bash脚本执行异常问题排查
我编写了一段Bash脚本,用于按顺序运行~/python目录下的test_01.py和test_02.py,预期执行流程为:
- 导航到
~/python - 运行
test_01.py - 运行
test_02.py - 返回
~/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特性
你的脚本存在两处关键错误,导致执行行为异常:
Shebang路径错误
脚本首行的#! usr/bin/env bash漏了开头的斜杠,正确写法是#!/usr/bin/env bash。这个错误会让系统找不到bash解释器,转而用默认的sh(Ubuntu默认是dash)运行脚本。而dash不支持for ((i=1; i<=2; i++))这种C风格循环,直接导致循环逻辑混乱。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
相关产品推荐
相关产品推荐

