最直接有效的办法是所有变量在条件判断中必须用双引号包裹并配合 -z 或 -n 显式检测空值;因未加引号时变量为空会导致 test 语法崩溃;推荐统一使用 [ -z "$var" \] 或 \[ -n "$var" ];脚本开头加 set -u 可捕获未定义变量;参数扩展如 ${var:-default} 能安全提供默认值。

最直接有效的办法是:所有变量在条件判断中必须用双引号包裹,配合 -z 或 -n 显式检测空值。
为什么变量不加引号会出错
当变量未定义或为空时,[ $var = "ok" ] 会被 shell 展开成 [ = "ok" ],缺少左操作数,触发 [: missing `]' 错误。这不是逻辑错误,而是语法崩溃——test 命令根本没机会执行。
正确写法:始终用双引号 + -z/-n
推荐统一使用以下形式:
-
if [ -z "$var" ]; then ...→ 变量为空(未定义、空字符串、纯空格)时为真 -
if [ -n "$var" ]; then ...→ 变量非空(长度 > 0)时为真;等价于if [ "$var" ]; then - 避免单独写
if [ $var ]或if [ "$var" = "" ],前者不安全,后者语义冗余且易漏引号
进阶加固:脚本开头加 set -u
在脚本第一行(#!/bin/bash 后)加上:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
set -u
这样一旦引用未定义变量(如 $USER_NAME 拼错成 $USERNAME),脚本立即报错退出,而不是静默传入空值导致后续判断失效。配合 -z 使用,能提前暴露问题。
快速兜底:用参数扩展提供默认值
不需要先判断再赋值,直接用内置语法:
-
db_host="${DB_HOST:-localhost}"→ DB_HOST 为空或未定义时自动取 localhost -
port="${PORT:-5432}"→ 同理,简洁安全 - 这种写法不依赖 if,也不怕变量为空,适合配置初始化场景










