当我们将不带 [](括号)的条件放入 bash 脚本的 if else 块中时,实际上会发生什么?

问题描述 投票:0回答:1
final=''
if [ $final ]; then echo "final"; else echo "not final"; fi;

看上面这段代码。如果我删除if块中的

括号
,它将如何应用以及为什么?
它如何评估这种情况下的状况?

这就是我试图写条件的方式。那时我实际上忘记了语法。它在控制台中打印

final
。当时我就期待它能打印出
not final
。 (我想我在某处读到,在 bash 条件下,空字符串的计算结果为 false)。虽然没有错误,但我知道语法有问题。

if $final; then printf "final"; else printf "not final"; fi;

然后我把它绕在括号上。现在它输出相反的结果。

not final

这些语句的

not
也给出没有任何错误的输出。现在我什么都看不懂了。

 if [ $final ]; then printf "final"; else printf "not final"; fi;

输出:

not final
.

if ! $final; then printf "final"; else printf "not final"; fi;

输出:

not final

if [ ! $final ]; then printf "final"; else printf "not final"; fi;

输出:

final
.
我完全困惑了!

我正在 Windows 中的

git-bash
中运行这些。

bash if-statement syntax git-bash boolean-expression
1个回答
0
投票

if
后面是要执行的命令。它通过检查退出状态是否为 0(成功)或非零(失败)来测试该命令的成功或失败。

括号实际上是要执行的命令,而不是

if
命令语法的一部分(它们不像 C 等语言中的括号)。
[
相当于
test
命令。

所以当你写作时

if $final

它将执行

$final
的内容作为命令。如果
$final
为空,则执行空命令。这被认为是成功的,因此
then
块被执行。如果你先这样做

final=something

然后做

if $final

您会收到一条错误消息,指出无法找到

something
。这是失败的,因此
else
块将被执行。

另一方面,当你写作时

if [ "$final" ]

它正在执行

test "$final"
test
命令只是检查其参数是否为空,并相应地设置其退出状态。

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