以下 bash 脚本:
#!/bin/bash
TEST_VAR=""
if [[ -z $TEST_VAR ]] then
echo "empty"
else
echo "$TEST_VAR"
fi
尽管“then”之前缺少一个分号,但在 bash 5.2 中不会引发错误并成功完成,甚至返回0
。
在运行 bash 5.1 或 5.0 的系统上运行上述脚本会按预期失败。
这是为什么?bash 在 5.2 版中更改了解析器吗?搜索后,我找不到任何关于此更改的参考资料。bash 是否故意在此处更改了行为,或者这是一个错误?
感谢 oguz ismail,他提供了证据来支持我无法找到的直觉——相关的邮件列表讨论和实现这一点的 git 提交。
简而言之,在 5.2 版本发布之前进行的邮件列表讨论中发现,
[[]]
要求在末尾使用分号的行为与其他复合命令的行为不一致,而其他复合命令不需要在末尾使用分号,因此[[]]
的行为已更改为与 5.2 版本推出之前的行为一致。]]
是保留字:来自保留字(Bash 参考手册) ——重点是我的:
[[ expression ]]
事实上,它是一个复合命令。从历史上看,其他复合命令(例如
{}
or )()
后面不需要加分号:因此
[[]]
的行为已更改为符合 5.2 推出之前的行为。