Shell脚本变量带末尾换行导致Trimmomatic路径拼接错误如何解决
问题根因
变量末尾携带异常换行符的核心原因是Samples_prefix.txt使用了Windows系统的CRLF换行格式(行尾为\r\n),Linux环境下Shell按LF(\n)拆分读取行时,会把每行末尾的\r回车符残留在读取到的变量值中,后续拼接文件名时就会出现后缀被挤到新行、路径无效的问题。如果文件末尾存在无换行的最后一行、空行,也可能触发读取异常。
修复方法
- 优先从源文件处理,执行以下命令将输入文件转为Unix换行格式,清除所有行尾多余的回车符:
sed -i 's/\r$//' Samples_prefix.txt - 优化Shell脚本的读取逻辑,增加兼容兜底,避免特殊格式文件引发执行错误,修正后的完整脚本如下:
while IFS= read -r sample || [[ -n "$sample" ]] do # 兜底清除变量末尾可能残留的回车、尾部空白 sample=$(echo "$sample" | tr -d '\r' | sed 's/[[:space:]]*$//') sample_id=$(echo "$sample" | cut -d/ -f 4 | tr -d '\r') java -jar ./trimmomatic-0.39.jar PE -threads 10 -phred33 \ "${sample}_R1_001.fastq.gz" \ "${sample}_R2_001.fastq.gz" \ "${sample_id}_PE1.fq.gz" \ "${sample_id}_SE1.fq.gz" \ "${sample_id}_PE2.fq.gz" \ "${sample_id}_SE2.fq.gz" \ HEADCROP:3 ILLUMINACLIP:./adapters/TruSeq3-PE-2.fa:2:30:10 CROP:95 \ LEADING:10 TRAILING:10 SLIDINGWINDOW:5:20 MINLEN:50 \ 2> "${sample_id}.out" done < Samples_prefix.txt
脚本修改说明
- 给
read命令增加IFS=、-r参数,避免读取时自动裁剪行首尾空白、转义特殊字符;增加|| [[ -n "$sample" ]]判断,兼容文件最后一行无换行符的场景,不会漏读最后一个样本 - 对读取到的
sample、提取的sample_id变量都增加了回车符清除逻辑,就算源文件没有提前转格式,也不会出现拼接断行问题 - 所有变量引用都用双引号包裹,避免路径中存在空格、特殊字符时命令执行报错
- 长命令用
\拆分多行,提升可读性,不影响实际执行逻辑
内容的提问来源于stack exchange,提问作者Fernando_Souza
相关产品推荐
相关产品推荐

