如何将zcat与bzcat合并为支持fastq.gz、fastq.bz2的通用函数
修复后的通用解压函数方案
原代码存在的问题
- 后缀提取逻辑错误:
${file##*/}仅能去除文件路径前缀得到纯文件名,无法提取文件后缀 - 条件判断语法错误:变量调用缺少
$符号,[ ext == "fastq.gz" ]实际是对固定字符串"ext"做对比,不会匹配变量值 - 命令拼写错误:bzip2解压命令为
bzip2,原代码中写为bzip无法正常执行 - 误用
exec命令:exec会替换当前shell进程,执行完解压命令后当前终端会直接退出,不符合使用预期 - 缺少异常处理逻辑:如果传入非指定格式的文件,会直接走bzip2分支,没有错误提示
可用的最终代码
zbzcat() { # 入参校验 if [ $# -lt 1 ]; then echo "用法: zbzcat <file.fastq.gz|file.fastq.bz2>" >&2 return 1 fi local target_file="$1" # 直接匹配文件后缀判断压缩类型 if [[ "$target_file" == *.gz ]]; then gzip -cd "$@" elif [[ "$target_file" == *.bz2 ]]; then bzip2 -cd "$@" else echo "错误:不支持的文件格式,仅支持.gz和.bz2后缀的压缩文件" >&2 return 1 fi }
使用说明
- 完全兼容你需要的调用方式:
zbzcat example.fastq.gzzbzcat example.fastq.bz2
- 支持多参数透传,所有输入参数会完整传递给底层的
gzip/bzip2命令,比如可以加参数zbzcat example.fastq.gz -f - 会自动校验输入文件格式,不符合要求时会输出明确的错误提示
内容的提问来源于stack exchange,提问作者Peter Pisher
相关产品推荐
相关产品推荐

