在开始正题之前,我们先明确一些基本的概念。,然后再来研究一下shell中,真假和0、1的关系。

1. Bash和Shell

shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。

Bash(Bourne Again shell),翻译过来,就是 Bourne shell 的扩展。是大多数Linux 系统的缺省 shell。

从语法上来讲,shell是弱类型语言。

2. 状态码

2.1 概念

在shell的语法中,每个表达式(命令)执行完退出的时候,都会返回一个退出状态码(exit status 0~255)。在所有的退出状态码中,0表示执行成功,1~255为(失败)退出的状态代号。详见下表(参考链接)。

状态码 描述
0 命令成功结束
1 通用未知错误
2 误用Shell命令
126 命令不可执行
127 没找到命令
128 无效退出参数
128+n Linux中信号为n的严重错误
130 通过Ctrl + C退出
255* 退出状态码越界

2.2 IF语句中的状态码

if语句根据 [ ] 中表达式执行的退出状态码进行判断。

如果状态码为0,则条件成立;如果状态为码非0,则条件不成立。

3. 真假和0、1

3.1 大胆假设

按照上面的思路继续深挖:

在shell中,0就表示真,1就代表假吗?

3.2 小心验证

带着问题,用下面的代码验证

#!/bin/bash
if [ 0 ];
then
echo '0 is true';
else
echo '0 is false';
fi

执行后结果如下:

0 is true

符合预期,那1是不是代表false(假)呢?

下面的代码验证

#!/bin/bash
if [ 1 ]; 
then
echo '1 is true';
else
echo '1 is false';
fi

执行后结果如下:

1 is true

也就是,不管if[ condition ]中写的不管是0还是1,都代表了true

其实,if里面不管写什么数字(或其他字符<串>),都表示真。


3.3 纯数字和状态码区别

步骤2步骤3中的内容不冲突了吗?

其实不然,两处的数字0和1表示的含义是完全不同的,前者表示的是命令的退出状态码,后者仅仅是一个数字。

看下面代码及结果

#!/bin/bash
if [ 10 -eq 10 ]; 
then
echo $?' is true';
else
echo $?' is false';
fi

结果为

0 is true

#!/bin/bash
if [ 10 -eq 11 ]; 
then
echo $?' is true';
else
echo $?' is false';
fi

结果为

1 is false

所以,作为状态码出现的时候,0就是true,1就是false

该状态码可以通过$?获取,在命令后面通过echo $?输出,0表示成功,1(非0)表示失败。

$?: $ 符号用来引用变量的值,? 是一个特殊的变量,存储紧邻的前驱命令执行的返回值。$? 一般组合用来检查上一个命令执行结果的返回值。

4 结论

if [ condition ]中:

A)当condition处出现的是一个表达式时,该命令执行后的状态码会作为判断条件:

当0作为状态码出现在condition位置的时候表示真;

非零数字作为状态码出现在condition位置的时候才表示假;


B)当condition处直接写一个数字时:

任何数字不以状态码的身份出现,而是直接写在condition位置时,都表示真。

注:shell脚本中的[ ]条件语句两端必须有空格 即[空格conditon空格]

5. 延伸

shell中的while(1)和C语言中的while(1)循环都表示死循环,但是原理不一样。

前者是因为判断语句中是数字,所以永真,后者是1代表true所以永真。

有帮到你吗?有用点一下哈|´・ω・)ノ