在 Linux 系统中,Shell 脚本是自动化任务的重要工具。然而,很多初学者在编写脚本时常常忽略两个关键问题:如何正确处理传入的参数 和 如何在脚本意外退出时清理临时资源。本文将手把手教你掌握这两个核心技能,让你的 Shell 脚本更加健壮、安全。

想象一下:你写了一个脚本,它会创建一个临时文件来处理数据。但如果用户输入了错误的参数,脚本崩溃退出,而临时文件却留在系统中——久而久之,这些“垃圾”会占用磁盘空间,甚至引发安全问题。
因此,良好的 Shell 脚本应具备:
Shell 脚本通过 $1、$2 等变量接收命令行参数。但直接使用它们很危险,因为用户可能不传参数,或传入无效值。
下面是一个安全处理参数的例子:
#!/bin/bash# 检查是否至少传入一个参数if [ $# -lt 1 ]; then echo "用法: $0 <文件名>" exit 1fiFILENAME="$1"# 检查文件是否存在if [ ! -f "$FILENAME" ]; then echo "错误: 文件 '$FILENAME' 不存在!" exit 1fiecho "正在处理文件: $FILENAME"在这个例子中,我们使用了 $# 来获取参数个数,并用 -f 判断文件是否存在。这是 Linux Shell参数处理 的基础实践。
trap 是 Shell 内置命令,用于在脚本接收到特定信号(如 EXIT、INT、TERM)时执行清理操作。
最常见的做法是捕获 EXIT 信号,无论脚本正常结束还是被中断(如 Ctrl+C),都会触发清理函数。
#!/bin/bash# 定义临时文件TMPFILE=$(mktemp)echo "临时文件创建于: $TMPFILE"# 定义清理函数cleanup() { echo "正在清理临时文件..." rm -f "$TMPFILE" echo "清理完成。"}# 注册 trap:当脚本退出时调用 cleanuptrap cleanup EXIT# 模拟一些工作echo "处理数据..."sleep 3echo "脚本执行完毕。"即使你在脚本运行中按 Ctrl+C 中断,cleanup 函数也会被调用,确保 资源清理 不会被遗漏。
现在,我们将前面的知识结合起来,写一个实用的备份脚本:
#!/bin/bash# 备份脚本:backup.sh <源目录> <目标目录>if [ $# -ne 2 ]; then echo "用法: $0 <源目录> <目标目录>" exit 1fiSRC_DIR="$1"DST_DIR="$2"# 验证源目录存在if [ ! -d "$SRC_DIR" ]; then echo "错误: 源目录 '$SRC_DIR' 不存在!" exit 1fi# 创建目标目录(如果不存在)mkdir -p "$DST_DIR"# 创建临时日志文件LOG_FILE=$(mktemp)cleanup() { echo "[INFO] 清理临时日志文件..." rm -f "$LOG_FILE"}trap cleanup EXIT# 执行备份echo "开始备份 $(date)" > "$LOG_FILE"tar -czf "$DST_DIR/backup_$(date +%Y%m%d).tar.gz" -C "$SRC_DIR" . 2>> "$LOG_FILE"echo "备份完成!日志已记录。"这个脚本展示了完整的 异常退出 处理流程:参数校验 → 资源创建 → 注册清理函数 → 执行任务 → 自动清理。
mktemp 创建临时文件,避免命名冲突trap 中尽量只做清理工作,不要执行复杂逻辑掌握 Linux Shell脚本 中的参数处理与资源清理,不仅能提升脚本的稳定性,还能体现你作为开发者的专业素养。记住:一个好脚本,不仅要“能跑”,更要“跑得干净”。
赶快动手改造你的旧脚本吧!
本文由主机测评网于2025-11-26发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/202511733.html