Shell Daily 2025-12-22: 变量安全检查 (Set Nounset)

Shell Daily 2025-12-22: 变量安全检查 (Set Nounset)

Shell Daily 2025-12-22: 变量安全检查 (Set Nounset)

Shell 脚本最可怕的噩梦是什么?大概就是那句传说中的 rm -rf "$APP_DIR/"。如果因为逻辑错误,$APP_DIR 变量恰好是空的,这行命令就会变成 rm -rf /,瞬间摧毁整个系统。

为了避免这种“变量未定义”导致的灾难,我们需要开启 Shell 的严格模式之一:nounset

怎么用

在脚本顶部加入:
set -uset -o nounset

开启后,一旦脚本尝试使用一个未定义的变量,Shell 不会像默认那样把它替换为空字符串,而是直接报错并终止运行

  • 兼容性POSIX 通用标准。Bash, Zsh, Dash 等均支持。

适用场景

所有的生产环境脚本。特别涉及文件删除、数据库操作或路径拼接时,它能充当“编译器”,帮你提前揪出拼写错误和逻辑漏洞。

示例 1:揪出隐蔽的拼写错误

在长脚本中,变量名手滑写错是常事。默认情况下,Shell 会静默执行,导致结果怪异。

#!/bin/bash
set -uTARGET_DIR="/var/www/html"# 手滑把 TARGET 拼成了 TAGRET
# 如果不加 set -u,这里会静默创建 /backup 目录,导致逻辑错误
# 加了 set -u,脚本会报错:TARGET_DIR: unbound variable
cp -r "$TAGRET_DIR" /backup/

示例 2:防止根目录被删

这是 set -u 的高光时刻。

#!/bin/bash
set -u# 假设由于上游逻辑错误,CLEAN_PATH 没被赋值
# CLEAN_PATH="/tmp/cache" echo "Cleaning up..."
# 触发报错,脚本立即停止,保护了系统
rm -rf "$CLEAN_PATH/"*

(注:如果你开启了 set -u,但某些变量确实可能是空的(可选参数),请配合我们之前讲过的 ${VAR:-default} 语法使用,例如 ${OPTIONAL_VAR:-},这样就不会报错了。)