linux条件判断报错如“[: missing ]”或“unexpected end of file”,主因是空格缺失:if与[间、[与条件间、运算符两侧均须空格;建议改用[[ ]]提升容错性,并用bash -n检查语法。

Linux 条件判断报错如 [: missing ] 或 syntax error: unexpected end of file,八成是空格惹的祸。Shell 把 [ 当作命令(即 test),它对空格极其敏感——不是“建议加”,而是“必须加”,少一个就失败。
重点查这三处空格
条件判断中三个位置缺空格最常触发报错:
-
if 和 [ 之间:必须有空格,
if[$a -eq 1]错,if [ $a -eq 1 ]对 -
[ 和第一个条件之间:方括号紧贴内容会变成单个参数,
[ -f file]错,[ -f file ]对(注意开头和结尾都要空) -
运算符两侧:比如
-eq、=、-z前后都得有空格,[ $a-eq1 ]或[ "$a"="$b" ]全部非法
用 [[ ]] 替代 [ ] 能避开多数空格陷阱
[[ ]] 是 Bash 内建关键字,容错更强:
- 变量未引号也不易崩:
[[ $a == $b ]]即使$a为空或含空格,通常不会报too many arguments - 不强制要求
[[和内容之间空格(但习惯上仍保留,更清晰) - 支持
&&、||、正则匹配=~等,比[ ]表达能力更强
快速定位空格问题的小技巧
别靠肉眼扫,用这几招验证:
- 把出错行单独复制到终端执行,看是否复现——能快速确认是不是语法本身问题
- 用
bash -n script.sh静态检查语法(不执行),它会直接指出哪行缺空格或括号不匹配 - 在可疑行前后加
echo "debug",确认执行流是否卡在 if 处,排除逻辑跳转干扰
数值比较别混用字符串操作符
常见连环错:写成 if [ $num == 5 ] ——看似像编程语言,但在 [ ] 中 == 不是标准 POSIX 操作符(部分 shell 支持但不可靠),且 $num 未引号时若为空,实际变成 [ == 5 ],直接报错。
- 数值比较统一用
-eq、-lt等:if [ "$num" -eq 5 ] - 字符串比较用
[[ ]] + ==:if [[ "$str" == "ok" ]] - 判空统一用
[[ -z "$var" ]],别写[ "$var" = "" ]











