Bash脚本Globbing文件名后生成.gz文件时通配符失效问题求助
解决通配符匹配后生成正确压缩文件名的问题
问题背景
目录中有一批格式规范的文件(如1.SNV.111-T.vcf),需要借助包含文件名片段(如111-T)的文本文件,通过通配符匹配完整文件名,最终用bgzip生成带.gz后缀的压缩文件。
原编写的Bash脚本如下:
#!/bin/bash while getopts f: flag do case "${flag}" in f) file=${OPTARG};; esac done while IFS="" read -r p || [ -n "$p" ] do vcf="*${p}.vcf" bgzip -c ${vcf} > ${vcf}.gz done < $file
脚本能成功执行bgzip,但输出文件名会变成*111-T.vcf.gz——因为输出路径中的通配符不会自动展开(目标文件不存在时,Shell不会解析通配符),导致带*的字符串被直接作为文件名。
修正后的脚本
#!/bin/bash while getopts f: flag do case "${flag}" in f) file="${OPTARG}";; esac done while IFS="" read -r p || [ -n "$p" ] do # 遍历所有匹配通配符的文件,让Shell自动展开通配符 for vcf in *"${p}".vcf; do # 确认当前路径是真实文件,避免无匹配时处理通配符字符串本身 if [ -f "$vcf" ]; then bgzip -c "$vcf" > "${vcf}.gz" fi done done < "$file"
关键说明
- 用
for循环遍历通配符表达式*"${p}".vcf,Shell会自动将其展开为所有匹配的实际文件名 - 添加
[ -f "$vcf" ]判断,防止当没有任何文件匹配时,误将*${p}.vcf这个字符串当作文件名处理 - 所有变量用双引号包裹,避免文件名包含空格、特殊字符时出现解析错误
内容的提问来源于stack exchange,提问作者Liam
相关产品推荐
相关产品推荐

