Shell脚本规范:set参数、错误处理、参数解析
525 字
3 分钟
Shell脚本规范:set参数、错误处理、参数解析
Shell 脚本中常见的隐患:报错后继续执行导致结果全错、中间步骤静默失败无人察觉、无注释导致后期无法维护。本文不讲 Shell 语法,聚焦规范:set -euo pipefail、错误处理、参数解析、日志记录和批量处理模板。
1. 脚本第一行——Shebang + 严格模式
#!/bin/bashset -euo pipefail这四行的含金量:
| 参数 | 全称 | 效果 |
|---|---|---|
-e | errexit | 任何命令返回非零退出码就立即停止 |
-u | nounset | 引用未定义变量就报错 |
-o pipefail | pipefail | 管道中任何一个命令失败都算整个管道失败 |
如果没有这些:
# 无set -e的灾难cd /nonexistent_dir # 失败!但脚本继续rm -rf * # 把当前目录删了...加了set -e后:
set -ecd /nonexistent_dir # 失败!脚本立即退出echo "这行不会执行"2. 变量定义——统一规范
# ✓ 好:花括号包围,路径用双引号DATA_DIR="/opt/bioinfo/data"SAMPLE_LIST="${DATA_DIR}/samples.txt"
# ✗ 差:没引号,路径含空格就崩DATA_DIR=/opt/bioinfo/data
# ✓ 好:参数从脚本外部传入THREADS=${1:-8} # 第一个参数,默认8
# ✓ 好:只读变量防止误改readonly REF_GENOME="/opt/refs/hg38.fa"3. 日志——每条脚本必须记录
LOG_FILE="pipeline_$(date +%Y%m%d_%H%M%S).log"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"}
log "Pipeline started"log "Input: ${INPUT_FILE}"log "Threads: ${THREADS}"4. 错误处理——知道哪里崩了
cleanup() { local exit_code=$? log "Script exited with code: ${exit_code}" # 清理临时文件 rm -rf "${TMP_DIR}"}trap cleanup EXIT
error_handler() { log "ERROR at line $1: command '$2' failed" exit 1}trap 'error_handler ${LINENO} "${BASH_COMMAND}"' ERR5. 批量处理模板
#!/bin/bashset -euo pipefail
INPUT_DIR="${1:?Usage: $0 <input_dir> <output_dir>}"OUTPUT_DIR="${2:?Usage: $0 <input_dir> <output_dir>}"THREADS=8
mkdir -p "${OUTPUT_DIR}"
for r1 in "${INPUT_DIR}"/*_R1.fastq.gz; do sample=$(basename "${r1}" _R1.fastq.gz) r2="${r1/_R1/_R2}"
echo "Processing: ${sample}"
fastp -i "${r1}" -I "${r2}" \ -o "${OUTPUT_DIR}/${sample}_clean_R1.fastq.gz" \ -O "${OUTPUT_DIR}/${sample}_clean_R2.fastq.gz" \ -w "${THREADS}" || { echo "ERROR: fastp failed for ${sample}" >&2 continue }done
echo "All done!"6. 踩坑
坑1:set -e在管道中不生效——必须加-o pipefail。
坑2:变量名里的空格——var = value(有空格)在Shell里是调用命令var。正确写法:var=value。
坑3:$*和$@的区别——"$@"带引号能保留每个参数的空格。日志用$*没问题,但循环参数必须"$@"。
本文于 2025-05-08 实测。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Shell脚本规范:set参数、错误处理、参数解析
https://fg.ink/posts/shell-script-best-practices/ 相关文章 智能推荐
1
Bash数组与字符串处理:参数展开、截取、替换
技术 Bash数组与字符串参数展开的完整指南,覆盖索引数组、关联数组、字符串截取替换及生信高频场景模板。
2
Bash循环与条件判断:for/if/case全解
技术 Bash循环与条件判断的完整实操指南,覆盖for/while/until、if/case分支及生信批量处理六大模板。
3
Git版本控制:项目管理全流程
技术 Git在生信项目管理中的完整工作流,覆盖初始化、分支策略、大文件处理与协作提交规范。
4
GNU Parallel批量处理:从串行到并行
技术 从串行for循环迁移到GNU Parallel并行处理的完整指南,覆盖批量比对、xargs对比和跨节点分发。
5
生信常见报错排查:20条错误与解决方案
技术 生信分析中20个常见报错的排查手册,按文件权限、内存溢出、软件依赖和流程逻辑分类,每条附错误原文与解决方案。
随机文章 随机推荐