Shell脚本规范:set参数、错误处理、参数解析

525 字
3 分钟
Shell脚本规范:set参数、错误处理、参数解析

Shell 脚本中常见的隐患:报错后继续执行导致结果全错、中间步骤静默失败无人察觉、无注释导致后期无法维护。本文不讲 Shell 语法,聚焦规范:set -euo pipefail、错误处理、参数解析、日志记录和批量处理模板。

1. 脚本第一行——Shebang + 严格模式#

#!/bin/bash
set -euo pipefail

这四行的含金量:

参数全称效果
-eerrexit任何命令返回非零退出码就立即停止
-unounset引用未定义变量就报错
-o pipefailpipefail管道中任何一个命令失败都算整个管道失败

如果没有这些:

Terminal window
# 无set -e的灾难
cd /nonexistent_dir # 失败!但脚本继续
rm -rf * # 把当前目录删了...

加了set -e后:

Terminal window
set -e
cd /nonexistent_dir # 失败!脚本立即退出
echo "这行不会执行"

2. 变量定义——统一规范#

Terminal window
# ✓ 好:花括号包围,路径用双引号
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. 日志——每条脚本必须记录#

Terminal window
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. 错误处理——知道哪里崩了#

Terminal window
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}"' ERR

5. 批量处理模板#

#!/bin/bash
set -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/
作者
风观
发布于
2024-05-15
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
风观
风有来路,观有所思
分类
标签
站点统计
文章
50
分类
1
标签
29
总字数
61,837
运行时长
0
最后活动
0 天前

文章目录