当前位置:K88软件开发文章中心网站服务器框架Shell → 文章内容

Shell 布尔运算

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:39:34

由 娃娃脸呦 创建,Loen 最后一次修改 2016-02-24 前言上个礼拜介绍了Shell编程范例之数值运算,对 Shell 下基本数值运算方法做了简单的介绍,这周将一起探讨布尔运算,即如何操作“真假值”。在 Bash 里有这样的常量(实际上是两个内置命令,在这里我们姑且这么认为,后面将介绍),即 true 和 false,一个表示真,一个表示假。对它们可以进行与、或、非运算等常规的逻辑运算,在这一节,我们除了讨论这些基本逻辑运算外,还将讨论Shell编程中的条件测试和命令列表,并介绍它们和布尔运算的关系。常规的布尔运算这里主要介绍 Bash 里头常规的逻辑运算,与、或、非。在 Shell 下如何进行逻辑运算范例:true or false单独测试 true 和 false,可以看出 true 是真值,false 为假$ if true;then echo "YES"; else echo "NO"; fiYES$ if false;then echo "YES"; else echo "NO"; fiNO范例:与运算$ if true && true;then echo "YES"; else echo "NO"; fiYES$ if true && false;then echo "YES"; else echo "NO"; fiNO$ if false && false;then echo "YES"; else echo "NO"; fiNO$ if false && true;then echo "YES"; else echo "NO"; fiNO范例:或运算$ if true || true;then echo "YES"; else echo "NO"; fiYES$ if true || false;then echo "YES"; else echo "NO"; fiYES$ if false || true;then echo "YES"; else echo "NO"; fiYES$ if false || false;then echo "YES"; else echo "NO"; fiNO范例:非运算,即取反$ if ! false;then echo "YES"; else echo "NO"; fiYES$ if ! true;then echo "YES"; else echo "NO"; fiNO可以看出 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 falsetrue: true Return a successful result.false: false Return an unsuccessful result.$ type true falsetrue is a shell builtinfalse is a shell builtin说明:$? 是一个特殊变量,存放有上一次进程的结束状态(退出状态码)。从上面的操作不难联想到在 C 语言程序设计中为什么会强调在 main 函数前面加上 int,并在末尾加上 return 0 。因为在 Shell 里,将把 0 作为程序是否成功结束的标志,这就是 Shell 里头 true 和 false 的实质,它们用以反应某个程序是否正确结束,而并非传统的真假值(1 和 0),相反地,它们返回的是 0 和 1 。不过庆幸地是,我们在做逻辑运算时,无须关心这些。条件测试从上节中,我们已经清楚地了解了 Shell 下的“逻辑值”是什么:是进程退出时的返回值,如果成功返回,则为真,如果不成功返回,则为假。而条件测试正好使用了 test 这么一个指令,它用来进行数值测试(各种数值属性测试)、字符串测试(各种字符串属性测试)、文件测试(各种文件属性测试),我们通过判断对应的测试是否成功,从而完成各种常规工作,再加上各种测试的逻辑组合后,将可以完成更复杂的工作。条件测试基本使用范例:数值测试$ if test 5 -eq 5;then echo "YES"; else echo "NO"; fiYES$ if test 5 -ne 5;then echo "YES"; else echo "NO"; fiNO范例:字符串测试$ if test -n "not empty";then echo "YES"; else echo "NO"; fiYES$ if test -z "not empty";then echo "YES"; else echo "NO"; fiNO$ if test -z "";then echo "YES"; else echo "NO"; fiYES$ if test -n "";then echo "YES"; else echo "NO"; fiNO范例:文件测试$ if test -f /boot/System.map; then echo "YES"; else echo "NO"; fiYES$ if test -d /boot/System.map; then echo "YES"; else echo "NO"; fiNO各种逻辑测试的组合范例:如果 a,b,c 都等于下面对应的值,那么打印 YES,通过 -a 进行"与"测试$ a=5;b=4;c=6;$ if test $a -eq 5 -a $b -eq 4 -a $c -eq 6; then echo "YES"; else echo "NO"; fiYES范例:测试某个“东西”是文件或者目录,通过 -o 进行“或”运算$ if test -f /etc/profile -o -d /etc/profile;then echo "YES"; else echo "NO"; fiYES范例:测试某个“东西”是否为文件,测试 ! 非运算$ if test ! -f /etc/profile; then echo "YES"; else echo "NO"; fiNO上面仅仅演示了 test 命令一些非常简单的测试,你可以通过 help test 获取 test 的更多用法。需要注意的是,test 命令内部的逻辑运算和 Shell 的逻辑运算符有一些区别,对应的为 -a 和 &&,-o 与 ||,这两者不能混淆使用。而非运算都是 !,下面对它们进行比较。比较 -a 与 &&, -o 与 ||, ! test 与 test !范例:要求某文件可执行且有内容,用 -a 和 && 分别实现$ cat > test.sh#!/bin/bashecho "test"[CTRL+D] # 按下组合键CTRL与D结束cat输入,后同,不再注明$ chmod +x test.sh$ if test -s test.sh -a -x test.sh; then echo "YES"; else echo "NO"; fiYES$ if test -s test.sh && test -x test.sh; then echo "YES"; else echo "NO"; fiYES范例:要求某个字符串要么为空,要么和某个字符串相等$ str1="test"$ str2="test"$ if test -z "$str2" -o "$str2" == "$str1"; then echo "YES"; else echo "NO"; fiYES$ if test -z "$str2" || test "$str2" == "$str1"; then echo "YES"; else echo "NO"; fiYES范例:测试某个数字不满足指定的所有条件$ i=5$ if test ! $i -lt 5 -a $i -ne 6; then echo "YES"; else echo "NO"; fiYES$ if ! test $i -lt 5 -a $i -eq 6; then echo "YES"; else echo "NO"; fiYES很容易找出它们的区别,-a 和 -o 作为测试命令的参数用在测试命令的内部,而 && 和 || 则用来运算测试的返回值,! 为两者通用。需要关注的是:有时可以不用 ! 运算符,比如 -eq 和 -ne 刚好相反,可用于测试两个数值是否相等; -z 与 -n 也是对应的,用来测试某个字符串是否为空在 Bash 里,test 命令可以用[] 运算符取代,但

[1] [2]  下一页


Shell 布尔运算