为什么在bash中,`if [false]`会被评估为true,而`if false`则不会呢?

3
在bash中运行此脚本将打印出"hello"。
if [ false ]; then
    echo hello
fi

在bash中运行此脚本将打印出"hello"。
if [[ false ]]; then
    echo hello
fi

只有当我去掉括号时,bash才不会打印“hello”。
if false; then
    echo hello
fi

我原以为括号的整个前提是为了实现额外的功能,比如&&||,为什么在这种情况下它反而起到了相反的作用?
编辑: 这是你所说的bash引用吗?它仍然打印出"hello"。
test=false
if [[ "$test" ]]; then
    echo hello
fi

2
如果条件为假,则执行命令false(1),它总是返回失败。如果条件为[ false ],则执行命令test(1)(或等效的内置命令),因为字符串"false"不为空,所以返回成功。 - undefined
我认为括号的整个前提是为了实现额外的功能,比如&&||,这是完全错误的;在[ ][[ ]]测试中的语义与没有括号的情况完全不同。例如,ls -le foo将使用ls选项以及参数foo运行ls命令。但是[[ ls -le foo ]]将尝试将lsfoo转换为整数(可能通过将它们解析为变量),并测试ls是否小于或等于(使用-le运算符)foo。请参阅我在这里的回答。 - undefined
1个回答

2
if function_or_program; then
    # do something
fi

这个检查是否function_or_program0退出,如果是,则执行do something块。
  • truefalse是以01退出的函数(和程序)。

  • [是一个函数(和一个与test相关联的程序),可用于测试字符串和数字。

  • [[是一个类似于[但更强大的函数。

所以,你观察到的是当使用[[[时,你正在测试字符串truefalse。所有长度不为0的字符串都被视为真,因此truefalse都将被视为true

我认为括号的整个前提是为了实现额外的功能,比如&&||
你也可以执行多个程序/函数。
if false || true; then
    # do something
fi

...并且将执行程序/函数与测试字符串结合起来也是可能的:
if ( false || true ) && [[ "$foo" == "$bar" ]]; then
    # do something
fi

@glennjackman 哦,谢谢。我确实是历史性的 :-) 我已经更新了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接