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

Bash循环仅执行一次迭代即终止的问题排查

问题解决:Bash循环仅执行一次后终止的原因与修复

问题根源

你的list_genomes.txt文件采用了Windows风格的换行符(CRLF,即\r\n),而Bash会将每行末尾的\r视为文件名的一部分。这导致后续迭代中变量x实际是FV32968\r这类带\r的字符串,拼接路径后变成FV32968\r_busco/run_hypocreales_odb10,系统自然找不到对应文件。

修复方案

1. 转换文件为Unix换行格式(推荐)

先把文件的换行符改成Unix的LF格式,彻底解决问题:

  • 若系统有dos2unix工具,直接执行:
    dos2unix list_genomes.txt
    
  • 没有dos2unix的话,用sed处理:
    sed -i 's/\r$//' list_genomes.txt
    
  • 或者用tr命令生成新文件:
    tr -d '\r' < list_genomes.txt > list_genomes_unix.txt
    
    之后循环使用list_genomes_unix.txt即可。

2. 在循环中直接处理换行符

如果不想修改原文件,可以在循环里去除x中的\r,同时优化循环写法(避免cat的潜在问题,比如文件名含空格):

while IFS= read -r x; do
    # 去除变量中的\r字符
    x=$(echo "$x" | tr -d '\r')
    # 使用引号包裹变量,避免特殊字符问题
    mv -v "${x}_busco/run_hypocreales_odb10" "/busco_runs/run_${x}"
done < list_genomes.txt

额外提示

  • 尽量避免用for x in $(cat file)这种写法,当文件名包含空格或特殊字符时会出错,改用while read更可靠。
  • 拼接路径时用${变量}的形式包裹变量,能避免很多因特殊字符导致的语法问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:01:13