布尔运算
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 是怎么工作的? 条件测试
从上节中,我们已经清楚地了解了 Shell 下的“逻辑值”是什么:是进程退出时的返回值,如果成功返回,则为真,如果不成功返回,则为假。 条件测试基本使用
范例:数值测试
$ if test -eq ;then echo "YES"; else echo "NO"; fi
YES
$ if test -ne ;then echo "YES"; else echo "NO"; fi
NO
范例:字符串测试
$ if test -n "not empty";then echo "YES"; else echo "NO"; fi
YES
$ if test -z "not empty";then echo "YES"; else echo "NO"; fi
NO
$ if test -z "";then echo "YES"; else echo "NO"; fi
YES
$ if test -n "";then echo "YES"; else echo "NO"; fi
NO
范例:文件测试
$ if test -f /boot/System.map; then echo "YES"; else echo "NO"; fi
YES
$ if test -d /boot/System.map; then echo "YES"; else echo "NO"; fi
NO 各种逻辑测试的组合
范例:如果 a,b,c 都等于下面对应的值,那么打印 YES,通过 -a 进行"与"测试
$ a=;b=;c=;
$ if test $a -eq -a $b -eq -a $c -eq ; then echo "YES"; else echo "NO"; fi
YES
范例:测试某个“东西”是文件或者目录,通过 -o 进行“或”运算
$ if test -f /etc/profile -o -d /etc/profile;then echo "YES"; else echo "NO"; fi
YES
范例:测试某个“东西”是否为文件,测试 ! 非运算
$ if test ! -f /etc/profile; then echo "YES"; else echo "NO"; fi
NO
上面仅仅演示了 test 命令一些非常简单的测试,你可以通过 help test 获取 test 的更多用法。需要注意的是,test 命令内部的逻辑运算和 Shell 的逻辑运算符有一些区别,对应的为 -a 和 &&,-o 与 ||,这两者不能混淆使用。而非运算都是 !,下面对它们进行比较。 比较 -a 与 &&, -o 与 ||, ! test 与 test !
范例:要求某文件可执行且有内容,用 -a 和 && 分别实现
$ cat > test.sh
#!/bin/bash
echo "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"; fi
YES
$ if test -s test.sh && test -x test.sh; then echo "YES"; else echo "NO"; fi
YES
范例:要求某个字符串要么为空,要么和某个字符串相等
$ str1="test"
$ str2="test"
$ if test -z "$str2" -o "$str2" == "$str1"; then echo "YES"; else echo "NO"; fi
YES
$ if test -z "$str2" || test "$str2" == "$str1"; then echo "YES"; else echo "NO"; fi
YES
范例:测试某个数字不满足指定的所有条件
$ i=
$ if test ! $i -lt -a $i -ne ; then echo "YES"; else echo "NO"; fi
YES
$ if ! test $i -lt -a $i -eq ; then echo "YES"; else echo "NO"; fi
YES
很容易找出它们的区别,-a 和 -o 作为测试命令的参数用在测试命令的内部,而 && 和 || 则用来运算测试的返回值,! 为两者通用。需要关注的是: 有时可以不用 ! 运算符,比如 -eq 和 -ne 刚好相反,可用于测试两个数值是否相等; -z 与 -n 也是对应的,用来测试某个字符串是否为空
在 Bash 里,test 命令可以用[] 运算符取代,但是需要注意,[之后与] 之前需要加上额外的空格
在测试字符串时,所有变量建议用双引号包含起来,以防止变量内容为空时出现仅有测试参数,没有测试内容的情况
下面我们用实例来演示上面三个注意事项: -ne 和 -eq 对应的,我们有时候可以免去 ! 运算 $ i=
$ if test $i -eq ; then echo "YES"; else echo "NO"; fi
YES
$ if test $i -ne ; then echo "YES"; else echo "NO"; fi
NO
$ if test ! $i -eq ; then echo "YES"; else echo "NO"; fi
NO
用 [ ] 可以取代 test,这样看上去会“美观”很多 $ if [ $i -eq ]; then echo "YES"; else echo "NO"; fi
YES
$ if [ $i -gt ] && [ $i -lt ]; then echo "YES"; else echo "NO"; fi
YES
记得给一些字符串变量加上 "",记得 [ 之后与 ] 之前多加一个空格 $ str=""
$ if [ "$str" = "test"]; then echo "YES"; else echo "NO"; fi
-bash: [: missing `]'
NO
$ if [ $str = "test" ]; then echo "YES"; else echo "NO"; fi
-bash: [: =: unary operator expected
NO
$ if [ "$str" = "test" ]; then echo "YES"; else echo "NO"; fi
NO
到这里,条件测试就介绍完了,下面介绍命令列表,实际上在上面我们已经使用过了,即多个test命令的组合,通过 &&,|| 和 ! 组合起来的命令序列。这种命令序列可以有效替换 if/then 的条件分支结构。这不难想到我们在 C 语言程序设计中经常做的如下的选择题(很无聊的例子,但是有意义):下面是否会打印 j,如果打印,将打印什么? #include <stdio.h>
int main()
{
int i, j; i=;j=;
if ((i==) && (j=)) printf("%d\n", j); return ;
}
很容易知道将打印数字 ,因为 i== 这个条件成立,而且随后是 &&,要判断整个条件是否成立,我们得进行后面的判断,可是这个判断并非常规的判断,而是先把 j 修改为 ,再转换为真值,所以条件为真,打印出 。因此,这句可以解释为:如果 i 等于 ,那么把 j 赋值为 ,如果 j 大于 (因为之前已经为真),那么打印出 j 的值。这样用 && 连结起来的判断语句替代了两个 if 条件分支语句。 正是基于逻辑运算特有的性质,我们可以通过 &&,|| 来取代 if/then 等条件分支结构,这样就产生了命令列表。 命令列表
命令列表的执行规律符合逻辑运算的运算规律,用 && 连接起来的命令,如果前者成功返回,将执行后面的命令,反之不然;用 || 连接起来的命令,如果前者成功返回,将不执行后续命令,反之不然。 范例:如果 ping 通 www.lzu.edu.cn,那么打印连通信息
$ ping -c www.lzu.edu.cn -W && echo "=======connected======="
非常有趣的问题出来了,即我们上面已经提到的:为什么要让 C 程序在 main() 函数的最后返回 ?如果不这样,把这种程序放入命令列表会有什么样的结果?你自己写个简单的 C 程序,然后放入命令列表看看。 命令列表的作用
有时用命令列表取代 if/then 等条件分支结构可以省掉一些代码,而且使得程序比较美观、易读,例如: 范例:在脚本里判断程序的参数个数,和参数类型
#!/bin/bash echo $#
echo $
if [ $# -eq ] && (echo $ | grep ^[-]*$ >/dev/null);then
echo "YES"
fi
说明:上例要求参数个数为 并且类型为数字。 再加上 exit ,我们将省掉 if/then 结构 #!/bin/bash echo $#
echo $
! ([ $# -eq ] && (echo $ | grep ^[-]*$ >/dev/null)) && exit echo "YES"
这样处理后,对程序参数的判断仅仅需要简单的一行代码,而且变得更美观。 注意: Bash 里头的 true 和 false 是我们通常认为的 和 么?
回答是:否。 true 和 false 它们本身并非逻辑值,它们都是 Shell 的内置命令,只是它们的返回值是一个“逻辑值”: $ true
$ echo $? $ false
$ echo $? 可以看到 true 返回了 ,而 false 则返回了 。跟我们离散数学里学的真值 和 并不是对应的,而且相反的。 范例:查看 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 。因为在 Shell 里,将把 作为程序是否成功结束的标志,这就是 Shell 里头 true 和 false 的实质,它们用以反应某个程序是否正确结束,而并非传统的真假值( 和 ),相反地,它们返回的是 和 。不过庆幸地是,我们在做逻辑运算时,无须关心这些。

shell 布尔运算的更多相关文章

  1. shell之路【第二篇】运算与文件调用

    Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 原生bash不支持简单的数学运算,默认都是字符串操作,但是可以通过其他命令来实现 算数运算 expr. ...

  2. bash shell中测试命令

    bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径.如果test命令中列出的条件成立,test命令就会退出并返回退出状态吗0 .这样if-than语句就与其他编程 ...

  3. shell简明教程

    shell的格式 shell可以在直接在命令行下输入,也可以保存成shell脚本文件运行.当命令简单并且不需要重复使用,在命令行输入直接执行即可,否则就写成脚本.shell脚本默认文件扩展名为.sh. ...

  4. Linux shell 编程文件比较

    文件比较允许你测试Linux 文件系统上文件和目录的状态 比较 描述 -d file  检查file是否存在并是一个目录 -e file 检查file是否存在 -f file 检查file是否存在并是 ...

  5. Shell记录-Shell脚本基础(二)

    Shell 基本运算符 算术运算符: 运算符 描述 例子 + Addition - Adds values on either side of the operator `expr $a + $b` ...

  6. Shell编程——bash基础知识

    # Bash中自动补全时忽略大小写 # 编辑~/.inputrc(没有的话,就新建一个),在最后加一行: set completion-ignore-case on # 若要用方向键Up,Down来搜 ...

  7. shell脚本:变量,文件判断,逻辑运算等纪要

    shell脚本中的变量定义,引用各有不同的方式,除此之外,很常用的有文件属性判断,逻辑运算,数值运算等,下面记录一下它们的属性作用 变量 shell变量的定义分为两种:一种是直接赋值定义,另一种是嵌套 ...

  8. shell之路 shell核心语法【第三篇】运算

    Bash 支持很多运算符,包括算数运算符.关系运算符.布尔运算符.字符串运算符和文件测试运算符. 原生bash不支持简单的数学运算,默认都是字符串操作,但是可以通过其他命令来实现 算数运算 expr. ...

  9. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

随机推荐

  1. jpress-配合nginx与tomcat安装

    目录 1. 前言 2. yum安装tomcat 2. yum安装MySQL 3. 下载JPress并安装 4. 配置tomcat使其可以部署多个网站 5. 安装nginx并配置 6. 将已经安装好的j ...

  2. python2.7 环境配置

    1.安装python2.7.8之后,配置环境变量:在path中配置python的安装路径 在cmd框中执行python,进入到python命令执行,即为配置成功. 2.执行过程中,提示缺少xlutil ...

  3. IE加载项

    加载项   加载项也称为ActiveX控件.浏览器扩展.浏览器帮助应用程序对象或工具栏,可以通过提供多媒体或交互式内容(如动画)来增强对网站的体验. 但是,某些加载项可导致计算机停止响应或显示不需要的 ...

  4. 渗透msf工具中andorid被控端的实现

    msf中andoird端的实现代码一共只有8k 核心代码就是下载者. 下载dex,动态执行dex.

  5. Apache+php+mysql环境配置

    Apache+PHP+MySQL环境搭建 标题格式 正文格式 阶段性完成格式 正文中强调格式 ————————————————————————————— 前语:本文是从我写过的doc文档迁移过来的,由 ...

  6. cordova+Android Studio 1.0+ionic+win7(转)

    转自http://blog.csdn.net/fuyunww/article/details/42216125 目录(?)[-] 在项目目录下执行 a创建工程 b添加平台支持 c添加插件在Androi ...

  7. APB总线

    APB(Advance Peripheral Bus)是AMBA总线的一部分,从1998年第一版至今共有3个版本. AMBA 2 APB Specfication:定义最基本的信号interface, ...

  8. BabelMap 10.0.0.5 汉化版已经发布

    新的 BabelMap 调整了用户体验的一些细节.修正了西夏语表意文字序列.修正了一些文字显示不全的问题. 请点击页面左上角连接,进入下载页面下载.

  9. Java设计模式应用——策略模式

    对于相同类型相同类型的输入输出,在不同场景下需要使用不同的逻辑处理,则可以使用策略模式. 比如排序算法有堆排序,快速排序,冒泡排序,选择排序等.为了保证排序效率,需要在不同场景下选择不同排序算法,这时 ...

  10. nginx 总结

    本文转自:http://freeloda.blog.51cto.com/2033581/1288553 ,感谢大神的辛勤付出! 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之 ...