Shell 中的真与假

Posted Li-Yongjun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell 中的真与假相关的知识,希望对你有一定的参考价值。

C 语言中的真与假

先看 C 语言,在 C 语言中,0 表示假,非 0 表示真,如下

#include <stdlib.h>

int main(int argc, char *argv[])
{
	if (1)
		printf("1 is true\\n");
	else
		printf("1 is false\\n");

    if (0)
		printf("0 is true\\n");
	else
		printf("0 is false\\n");

	return EXIT_SUCCESS;
}
1 is true
0 is false

逻辑运算符 || 和 && 的特点

A || B ,如果 A 为真,B 就不会被执行了

A && B ,如果 A 为假,B 就不会被执行了

示例

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    1 || printf("print me after 1 || \\n");	// 不打印
    0 || printf("print me after 0 || \\n");	// 打印
    1 && printf("print me after 1 && \\n");	// 打印
    0 && printf("print me after 0 && \\n");	// 不打印

	return EXIT_SUCCESS;
}
print me after 0 || 
print me after 1 &&

Shell 中的真与假

情况略微复杂,分为 if [ A ] 和 A || B 两种情况

一、先看 if [ A ] ,又分为两种情况

  1. 如果 A 是个数字,则 if [ A ] 始终为真,如下
if [ 1 ] ; then
    echo "1 is true"
else
    echo "1 is false"
fi

if [ 0 ] ; then
    echo "0 is true"
else
    echo "0 is false"
fi
1 is true
0 is true
  1. 如果 A 是个表达式,则用 A 的返回值也就是状态码,来决定 if [ A ] 的真假,不过当状态码为 0 时 if [ A ] 为真,当状态码为非 0 时 if [ A ] 为假,如下
if [ 5 -eq 5 ] ; then
    echo "$? is true"
else
    echo "$? is false"
fi

if [ 5 -eq 6 ] ; then
    echo "$? is true"
else
    echo "$? is false"
fi
0 is true
1 is false

二、再看 A || B
A 和 B 一般为命令语句,当 A 执行后返回的状态码为 0 时,说明 A 执行成功, 就不会再执行 B 了;当 A 执行后返回的状态码为非 0 时,说明 A 执行出错,继续执行 B 。状态码含义如下

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

验证如下,true 命令执行后,会返回一个正确的结果,它本身就是干这个事情的。我们使用 $? 来直接打印这个正确的结果是几,答案是 0,这也进一步验证了状态码为 0 表示命令执行成功。false 命令同理。

$ help true
true: true
    返回一个成功结果。
    
    退出状态:
    总是成功。
$ echo $?
0
$ help false
false: false
    返回一个不成功的结果。
    
    退出状态:
    总是失败。
$ echo $?
1

实用示例

rm /home/test/a.out || exit 1
...
...

如果语句 rm /home/test/a.out 执行成功,就会返回 0,表示语句执行成功,这里的 0 为状态码,表示真,就不会执行 exit 1 了。
相反,如果语句 rm /home/test/a.out 执行失败,就会返回一个非 0 值来表示语句出错原因,状态码非 0 表示假,就会继续执行 exit 1
这种写法就达到了语句执行失败退出整个程序(脚本)的目的。

总结

C 语言中0 表示假,非 0 表示真
Shell 中,作为数字,任何值都是真;作为状态码,0 表示真,非 0 表示假

以上是关于Shell 中的真与假的主要内容,如果未能解决你的问题,请参考以下文章

16个细节,教你辨别自动驾驶路测视频中的真与假

JavaScript基本概念C - 真与假

为啥“真或真与假”似乎同时是真假?

python系列教程130——真与假

分类--真与假以及正类别与负类别

第一章 逻辑--真与假的二元世界