最直接有效的方式是检查 $uid 是否等于 0,因 root 用户 uid 恒为 0;推荐用 if [ "${uid:-1}" -eq 0 ] 判断并 exit 1 退出,备选 id -u 更兼容,不推荐 whoami 或 $user 字符串比较。

最直接有效的方式是检查 $UID 是否等于 0,因为 root 用户的 UID 固定为 0。这个判断应放在脚本开头,执行关键操作前立即验证,避免非 root 用户误触敏感逻辑。
推荐写法:用 $UID 判断(兼容性好、效率高)
这是最稳妥的方案,$UID 是 shell 内置变量,无需调用外部命令,速度快且在 bash/dash/sh 等主流 shell 中普遍支持。
- 标准写法:
if [ "$UID" -eq 0 ]; then ... - 更严谨防空值:
if [ "${UID:-1}" -eq 0 ]; then ...(避免某些精简 shell 中$UID为空导致语法错误) - 失败时建议明确退出:
exit 1,并输出提示如"Error: This script must be run as root."
备选写法:用 id -u(跨 shell 更可靠)
当脚本可能运行在 /bin/sh 指向 dash 等不保证 $UID 可用的环境时,id -u 是更通用的选择——它始终返回当前用户真实 UID,不受 shell 实现差异影响。
- 常用形式:
if [ "$(id -u)" = "0" ]; then ... - 注意用双引号包裹命令替换结果,防止空输出引发
[ : unexpected operator错误 - 相比
whoami,id -u不依赖用户名字符串匹配,不受 locale 或别名干扰
不推荐写法:仅靠 whoami 或 USER 变量
这些方式表面直观,但存在明显隐患:
-
whoami是外部命令,启动开销大;若 PATH 被篡改或二进制缺失,判断会失败 -
$USER可被用户手动修改(如USER=xxx),不具备权威性 - 字符串比较(如
[ "$USER" = "root" ])易受大小写、空格、换行符影响,可靠性低
实际应用示例
把判断逻辑封装成可复用的检查函数,提升脚本健壮性:
check_root() {
if [ "${UID:-$(id -u)}" -ne 0 ]; then
echo "Error: Please run as root." >&2
exit 1
fi
}
check_root # 调用检查
# 后续执行挂载、修改系统配置等特权操作
这样既优先使用内置 $UID,又在不可用时自动回退到 id -u,兼顾性能与兼容性。











