核心解决方法是用双引号包裹变量并优先使用[[ ]]:变量为空时,未加引号会导致词法分裂,使[ $var = "ok" ]展开为[ = "ok" ]而报错;[[ "$var" == "yes" ]]更健壮,支持多条件和正则,判空应统一用[ -z "$var" ]或[[ -z "$var" ]]。

核心解决方法是:所有变量在条件判断中必须用双引号包裹,且优先使用 [[ ]] 替代 [ ]。
变量为空时为什么会报错
shell 在执行 if [ $var = "ok" ] 前,先展开变量。若 var 为空,实际运行的是:
[ = "ok" ]
这相当于 test 命令缺少第一个操作数,触发 unary operator expected 错误。根本原因是未加引号导致词法分裂(word splitting),参数结构被破坏。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
必须加双引号:防御性引用的写法
无论变量是否可能为空,只要参与条件判断,一律用 "$var":
-
if [ "$var" = "yes" ]; then✅ 展开为[ "" = "yes" ],语法合法 -
if [[ "$var" == "yes" ]]; then✅ 同样安全,且支持更多特性 -
if [ $var = "yes" ]; then❌ 空值时崩溃 -
if [[ $var == "yes" ]]; then❌ 空值时可能解析为[[ == "yes" ]],报错
推荐统一用 [[ ]] + 双引号组合
[[ ]] 是 Bash/Ksh/Zsh 内置关键字,比 [ ] 更健壮:
- 支持
&&、||,写多条件更清晰:if [[ "$a" == "x" && "$b" != "" ]] - 自动处理空值和含空格字符串,不依赖引号也能避免部分错误(但引号仍是强建议)
- 支持正则匹配:
if [[ $str =~ ^[0-9]+$ ]] - 注意:
[[ ]]中不要混用[ ]语法,如if [[ [ $x ] ]]是非法嵌套
判断变量是否为空的规范写法
不用 if ! -z $var(会报 command not found),正确方式是:
- 判空:
if [ -z "$var" ]; then或if [[ -z "$var" ]] - 判非空:
if [ -n "$var" ]; then或if [[ -n "$var" ]] - 等价写法:
if [[ "$var" == "" ]](字符串比较)、if [[ "$var" ]](隐式判非空,但需确保引号存在)










