在开始正题之前,我们先明确一些基本的概念。,然后再来研究一下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所以永真。
版权属于:Vsunks.V
本文链接:http://blog.sunxiaowei.net/lang/231.html
转载时须注明出处及本声明