在 5.2 版中,分号现在在带有 [[.. ]] 的 bash 条件中是可选的吗?

问题描述 投票:0回答:1

以下 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 是否故意改变了这里的行为,或者这是一个错误?

bash
1个回答
7
投票

感谢 oguz ismail,它通过查找相关的邮件列表讨论和实现此功能的 git 提交,找到了支持我的直觉的证据,但我无法找到。


简而言之,经过 5.2 版本发布之前的邮件列表讨论,发现

[[]]
需要末尾分号的行为与其他复合命令 的行为不一致,而后者不需要分号末尾有一个分号,并且
[[]]
的行为已更改为符合 5.2 推出之前的行为


]]
是保留字:

$ LANG=C type ]]
]] is a shell keyword

来自 保留字(Bash 参考手册) - 强调我的:

保留字是对 shell 有特殊含义的字。 它们用于开始和结束 shell 的复合命令

并且

[[ expression ]]
实际上是一个复合命令

从历史上看,其他复合命令(例如

{}
()
)后面从来不需要分号:

$ if { true; } then echo foo; fi # no semicolon after the first `}`, no syntax error
foo
$ if ( true ) then echo foo; fi # no semicolon after the first `)`, no syntax error
foo
$ if { true; } then { echo foo; } fi # no semicolon after the second `}`, no syntax error either
foo

因此

[[]]
的行为已更改以符合 5.2 推出之前的行为。

© www.soinside.com 2019 - 2024. All rights reserved.