1

I saw something unexpected today.

$ bash -c 'false'
$ echo $?
1 

This is as expected.

$ bash -c '[ false ]'
$ echo $?
0

Wat.

Similarly:

$ if [ false ]; then echo 'true'; fi 
true

I think I understand that test a.k.a. [ does not execute its argument. But... what does it really do with it?

4

4 回答 4

5

这是因为test(这是[运行的)不运行它的参数,它根据它理解的运算符对其进行评估——! = != -a -n等等。特别是,任何与运算符不匹配的字符串都是不等于空字符串的测试. false是这样一个无法识别的字符串,因此将其与空字符串(不相等)进行比较,因此会导致true退出代码...

man test将向您展示所有运营商test都了解的情况。

于 2013-06-08T03:14:40.930 回答
4
if { false ; } ; then echo TRUE; fi
if ( false ) ; then echo TRUE; fi
if false ; then echo TRUE; fi

所有这些形式都执行错误的命令。

if [ false ] ; then echo TRUE; fi
if test false ; then echo TRUE; fi

这些不执行任何操作。

于 2013-06-08T03:37:40.530 回答
1

[是一个与内置命令同义的 bash 内置命令test(不同于/usr/bin/test)。最基本的测试很简单[ string ],如果字符串不为空或不为空,则为真。

您可以在此处找到扩展示例。

于 2013-06-08T03:20:05.490 回答
0

[像任何其他程序一样处理它的参数,它只是碰巧改变了它的返回值以更直接地反映它们包含的内容。如果您查看它的手册页,您会看到当使用两个参数运行时(false]这种情况下),当且仅当第一个为非空且第二个为]. 两者都是真的,所以它返回成功。

于 2013-06-08T03:20:09.817 回答