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.txtlist_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
相关产品推荐
相关产品推荐

