Shell循环脚本关联不同扩展名输入文件报错的排查与解决
Shell循环关联文件报错的解决方法
问题场景
编写Shell for循环遍历assemblies/目录下的.fastq文件,尝试关联对应名称的_assembly.fasta文件运行minimap2时,报错「找不到文件或文件夹」,具体提示无法打开hour01_assembly.fasta(该文件实际存在于目标目录中)。使用ShellCheck检测原代码未发现问题。
原报错代码
for file1 in assemblies/*.fastq; do basename=${file1%.fastq} file2="$basename"_assembly.fasta minimap2 -ax map-ont "$file2" "$file1" > "$basename"_aln.sam done
解决后的代码
#!/usr/bin/bash #set -x for file1 in assemblies/*.fastq; do basename="${file1%.fastq}" basename="${basename##*/}" file2=assemblies/"$basename"_assembly.fasta [ $file2 ] || continue echo "f1=$file1", "f2=$file2" minimap2 -ax map-ont "$file2" "$file1" > "$basename"_aln.sam done
问题原因与修改说明
- 原代码问题:
basename=${file1%.fastq}得到的是包含完整目录路径的字符串(例如assemblies/hour01),直接拼接后file2的路径逻辑错误,无法正确指向目标.fasta文件。 - 关键修改点:
- 新增
basename="${basename##*/}":剥离目录路径,只保留纯文件名(如hour01)。 - 显式构建
file2的完整路径assemblies/"$basename"_assembly.fasta,确保指向正确的文件位置。 - 添加
[ $file2 ] || continue:跳过变量为空的情况,避免无效执行。 - 增加
echo语句用于调试,直观确认文件路径是否正确。
- 新增
内容的提问来源于stack exchange,提问作者Thulasi R
相关产品推荐
相关产品推荐

