上个礼拜介绍了 数据运算,对 Shell 下基本数值运算方法做了简单的介绍,这周将一起探讨布尔运算,即如何操作“真假值”。
在 Bash 里有这样的常量(实际上是两个内置命令,在这里我们姑且这么认为,后面将介绍),即 true 和 false,一个表示真,一个表示假。对它们可以进行与、或、非运算等常规的逻辑运算,在这一节,我们除了讨论这些基本逻辑运算外,还将讨论Shell编程中的条件测试和命令列表,并介绍它们和布尔运算的关系。
这里主要介绍 Bash
里头常规的逻辑运算,与、或、非。
在 Shell 下如何进行逻辑运算
范例:true or false
单独测试 true
和 false
,可以看出 true
是真值,false
为假
$ if true;then echo "YES"; else echo "NO"; fi
YES
$ if false;then echo "YES"; else echo "NO"; fi
NO
范例:与运算
$ if true && true;then echo "YES"; else echo "NO"; fi
YES
$ if true && false;then echo "YES"; else echo "NO"; fi
NO
$ if false && false;then echo "YES"; else echo "NO"; fi
NO
$ if false && true;then echo "YES"; else echo "NO"; fi
NO
范例:或运算
$ if true || true;then echo "YES"; else echo "NO"; fi
YES
$ if true || false;then echo "YES"; else echo "NO"; fi
YES
$ if false || true;then echo "YES"; else echo "NO"; fi
YES
$ if false || false;then echo "YES"; else echo "NO"; fi
NO
范例:非运算,即取反
$ if ! false;then echo "YES"; else echo "NO"; fi
YES
$ if ! true;then echo "YES"; else echo "NO"; fi
NO
可以看出 true
和 false
按照我们对逻辑运算的理解进行着,但是为了能够更好的理解 Shell 对逻辑运算的实现,我们还得弄清楚,true
和 false
是怎么工作的?
Bash 里头的 true 和 false 是我们通常认为的 1 和 0 么?
回答是:否。
范例:返回值 v.s. 逻辑值
true
和 false
它们本身并非逻辑值,它们都是 Shell 的内置命令,只是它们的返回值是一个“逻辑值”:
$ true
$ echo $?
0
$ false
$ echo $?
1
可以看到 true
返回了 0,而 false
则返回了 1 。跟我们离散数学里学的真值 1 和 0 并不是对应的,而且相反的。
范例:查看 true 和 false 帮助和类型
$ help true false
true: true
Return a successful result.
false: false
Return an unsuccessful result.
$ type true false
true is a shell builtin
false is a shell builtin
说明:$?
是一个特殊变量,存放有上一次进程的结束状态(退出状态码)。
从上面的操作不难联想到在 C 语言程序设计中为什么会强调在 main
函数前面加上 int
,并在末尾加上 return 0
。因为在 Shell 里,将把 0 作为程序是否成功结束的标志,这就是 Shell 里头 true
和 false
的实质,它们用以反应某个程序是否正确结束,而并非传统的真假值(1 和 0),相反地,它们返回的是 0 和 1 。不过庆幸地是,我们在做逻辑运算时,无须关心这些。