当前位置: 首页 > 知识库问答 >
问题:

为什么bash在if语句中将未定义的符号视为true?

彭建业
2023-03-14

在下面的简单示例中,如果脚本中未设置条件,则运行脚本会打印“True”。然而,人们会期望它打印“False”。这种行为的原因是什么?

# Set CONDITION by using true or false:
# CONDITION=true or false

if $CONDITION; then
    echo "True"
else
    echo "False"
fi

共有1个答案

沈旻
2023-03-14

if的参数是要执行的语句,并测试其退出状态。如果退出状态为0,则条件为真,并且中的语句将执行

未设置$CONDITION时,语句为空语句,空语句始终具有零退出状态,即成功。因此if条件成功。

POSIX外壳规范中解释了这种行为:

如果没有命令名,但命令包含命令替换,则该命令应以最后执行的命令替换的退出状态完成。否则,命令应以零退出状态完成。

 类似资料:
  • 我最近阅读了一些使用将变量转换为布尔值以在if语句中进行评估的代码。这对我来说似乎有些多余,因为无论如何都会评估变量的布尔值。这样做有什么性能优势吗?还是为了更好地支持浏览器? 示例代码: 编辑: 我也在非布尔类型的操作数中看到了这一点,但我一直假设使用无论如何都会评估变量的布尔值,因为Javascript中的所有值都是“真实的”或“Falsey”。 示例代码:

  • 4.8 符号定义语句 在程序中,我们经常要使用一些常量或数值表达式,并把它们直接写在指令中,但当需要修改时,就要对它们逐个进行修改,这无疑会增加维护程序的工作量,而且每个常量或表达式所代表的含义也容易遗忘。 为了改善程序的可读性,尽量减少维护程序的工作量,汇编语言提供了为常量或表达式定义一个符号名的方法。一旦定义了符号名,在指令中就可直接使用它们。 4.8.1 等价语句 1、一般格式 等价语句的一

  • 问题内容: i=0 for f in do echo “i value is $i” if [“$i” = “0”] then echo “here” i=$((i+1)) continue fi arr[i]=$f i=$((i+1)) done 在上面的bash脚本中,我在使用if语句时出现了一个错误,它看起来像这样 请指出我的错误。 问题答案: 采用 在bash,你需要周围的空间,并在条件

  • 问题内容: 我在处理应用程序时犯了一个编码错误,它是对null引用的测试。我花了几个小时才发现问题所在,但是我不明白的是为什么代码如此表现。 if语句以结束,这是我的错误,即使很明显两个值都为null ,也将打印出来。有人可以解释为什么吗? 问题答案: 该分号结束了一条语句(一个空的语句),因此编译器将您的代码翻译为以下内容: 换句话说,如果expression是,它将执行空的代码块。然后,无论是

  • 问题内容: 以下Java代码无法编译。 为什么?在没有先声明的情况下,没有代码路径可导致程序将1分配给该路径。 我想到的范围可能仅限于第一条陈述,但后来我不明白为什么。如果我真的不想不必要地声明以提高性能怎么办?我不喜欢声明后不使用变量。 (您可能想争论一下,我不可以在第二条语句中简单地声明b ,在这种情况下,请想象一下它可能在其他地方处于循环中。) 问题答案: 为什么?如果没有先声明,没有代码路

  • 我目前正在修复别人的Java代码中的一个bug,但我无法解释这个bug。所讨论的代码是下面的if语句: 其中初始化为和函数如下所示: 令我困惑的是,即使被设置为false,代码仍然调用并执行函数。我一直认为这是不应该发生的短路。if语句本身总体上仍然被计算为false,因为只有第一个代码段中的else-block中的代码被执行。 那么,这个if语句为什么会有这样的行为呢?是短路失败,还是我误解了原