之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断。传回0,即为真;传回非0,即为假。

在Bash中,这种可以影响程序流程的式子,称为条件判断式。判断式的操作数分成“单元”及“二元”两种。如“-f 文件”可测试文件是否存在,运算符 -f 后接一个操作数“文件”,这种判断式称为“单元”;如“参数 1 -gt 参数2”可测试“参数1”的值是否大于“参数2”,运算符 -gt 的左右各接一个要比较的参数,这种判断式称为“二元”。大多数“单元”的判断式用于判断文件的相关属性,少数用于测试字符串和Bash的选项。

1.关于文件属性的判断式

Bash关于文件属性的条件判断式,如下表:

序号 判断式 在什么情况下为真
1 -a 文件 如果文件存在
2 -b 文件 如果文件存在,且该文件是区域设备文件
3 -c 文件 如果文件存在,且该文件是字符设备文件
4 -d 文件 如果文件存在,且该文件是目录
5 -e 文件 如果文件存在(注意,有可能是目录名)
6 -f 文件 如果文件存在,且该文件是一般文件
7 -g 文件 如果文件存在,且该文件设立了 set group id 属性
8 -h 文件 如果文件存在,且该文件是符号链接文件
9 -k 文件 如果文件存在,且该文件设立了 sticky 位的属性
10 -p 文件 如果文件存在,且该文件是管道文件(FIFO)
11 -r 文件 如果文件存在,且该文件具有可读取的属性
12 -s 文件 如果文件存在,且该文件的文件大小大于0
13 -t 文件描述符 如果文件描述符是开启的,且链接了某一个终端
14 -u 文件 如果文件存在,且该文件设立了 set user id 属性
15 -w 文件 如果文件存在,且该文件可写入的属性
16 -x 文件 如果文件存在,且该文件有可执行的属性
17 -O 文件 如果文件存在,且该文件为有效的使用者 id 所拥有
18 -G 文件 如果文件存在,且该文件为有效的群组 id 所拥有
19 -L 文件 如果文件存在,且该文件是符号链接文件
20 -S 文件 如果文件存在,且该文件是 socket 文件
21 -N 文件 如果文件存在,且该文件自上次读取后,曾修改过
22 文件1 -nt 文件2 如果文件1 比 文件2 新;或文件1存在,但文件2不存在
23 文件1 -ot 文件2 如果文件1 比 文件2 旧;或文件2存在,但文件1不存在
24 文件1 -ef 文件2 如果文件1 和 文件2 参考到相同的设备和 inode 编号

举例:

#!/bin/bash

[ -e "/etc/hosts" ] || (echo '/etc/hosts 文件不存在.'; exit 1)
if [ "$?" -eq 1 ]; then
exit
fi
echo '/etc/hosts 文件存在,后续处理继续执行下去...'

行3,使用 -e 判断 /etc/hosts 这个文件是否存在,如果不存在,则 () 开启一个字 shell,显示文件不存在的信息,然后传回离去状态值 1。

行4,如果离去状态为1,就结束script。

2.关于字符串的条件判断式

Bash关于字符串的条件判断式,如下表:

序号 判断式 在什么情况下为真
1 -z 字符串 如果字符串长度为 0 (即空字符串)
2 -n 字符串 如果字符串长度不为 0 (即非空字符串)
3 字符串 如果字符串不为 0
4 字符串1 == 字符串2 如果两个字符串相等
5 字符串1 = 字符串2 如果两个字符串相等
6 字符串1 != 字符串2 如果两个字符串不相同
7 字符串1 < 字符串2 如果字符串1 小于 字符串2
8 字符串1 > 字符串2 如果字符串1 大于 字符串2

特别注意:如果 < 和 > 出现在 [ ] 或 test 命令中,要用 \ 转义特殊字符的意义,即要写成:[ 字符串1 \< 字符串2 ] 和 [ 字符串1 \> 字符串2 ];但如果出现在 [[ ]] 中,则不必。

#!/bin/bash

if [ "$LOGNAME" != "root" ]; then
echo '本程序须使用root权限执行.'
exit 1
fi echo '现在正在以root权限执行本程序.'

在对比字符串时,最好把变量名称用双引号含括,以免变量内容为空时造成语法错误。以下示例是不好的写法:

#!/bin/bash

NAME=$1

if [ $NAME = "Joy" ]; then
echo '你是Joy'
else
echo '你不是Joy'
fi

行5,如果变量$NAME的值为空,会造成if语法不完成的错误:

if [ = "Joy" ]; then

正确的写法:

#!/bin/bash

NAME=$1

if [ "$NAME" = "Joy" ]; then
echo '你是Joy'
else
echo '你不是Joy'
fi

另外,为了提高移植性,让script可在其他shell环境中执行,如传统的Boune Shell,会利用以下技巧来判断字符串是否相等,以避免空值变量造成语法错误:

#!/bin/bash

NAME=$1

if [ X"$NAME" = X"Joy" ]; then
echo '你是Joy'
else
echo '你不是Joy'
fi

行5,如果 $NAME 为空,式子变成:

if [ X = X"jOY" ]; then

这样,可保证语法完整。这里的 X,可换成其他任一英文字符。

3.关于算式的条件判断式

所谓算式,在此指其值或运算结果是数值(如 整数、非字符串)

序号 判断式 在什么情况下为真
1 参数1 -eq 参数2 参数1 和 参数2 的值相等
2 参数1 -ne 参数2 参数1 和 参数2 的值不相等
3 参数1 -lt 参数2 参数1 的值小于 参数2
4 参数1 -le 参数2 参数1 的值小于或等于 参数2
5 参数1 -gt 参数2 参数1 的值大于 参数2
6 参数1 -ge 参数2 参数1 的值大于或等于 参数2

举例:

#!/bin/bash

declare i len
len=$1 if [ $len -eq 100 ]; then
echo '长度100'
else
echo "长度不是100,而是$len"
fi

行4,由命令行位置参数$1,取得len的变量值。

4.关于Bash选项的条件判断式

序号 判断式 在什么情况下为真
1 -o set的选项名称 如果该选项是开启的状态

举例:

#!/bin/bash

set -o

if [ -o history ]; then
echo 'Bash选项history开启'
else
echo 'Bash选项history关闭'
fi

行3,使用set命令行选出目前Shell中的选项。

行5,判断history选项是否开启。

【重点】Shell入门教程:流程控制(3)条件判断式的真假值的更多相关文章

  1. 廖雪峰Java1-3流程控制-3条件判断

    1.if条件判断的格式 if (条件) { 代码块 } if (条件) { 代码块1 } else { 代码块2 } if (条件1) { 代码块1 } else if { 代码块2 } else { ...

  2. Python流程控制-2 条件判断

    条件判断 条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块. 在Python语法中,使用if.elif和else三个关键字来进行条件判断. if语句的一般形式如下 ...

  3. shell编程 之 流程控制(条件语句和循环语句)

    1 if ...else... 基本格式: if condition then commend else commend fi 当然也可以写到一行,用[ ]表明边界,用:表示分行.比如: if [ $ ...

  4. ansible-playbook流程控制-when条件判断

    1. ansible-playbook添加判断     when相当于shell脚本里的if 判断,when语句就是用来实现这个功能的,它是一个jinja2的语法,但是不需要双大括号,用法很简单  1 ...

  5. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  6. Shell入门教程:流程控制(1)命令的结束状态

    在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环 ...

  7. Shell命令和流程控制

    Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...

  8. shell脚本之流程控制

      shell脚本之流程控制 shell脚本之流程控制 条件语句 条件判断 循环语句for,while,until for循环 while循环 until循环 循环控制语句continue 循环控制语 ...

  9. Python3.7.4入门-2流程控制工具

    2 流程控制工具 记得在语句后加冒号 2.1 while # Fibonacci series: # the sum of two elements defines the next a, b = 0 ...

随机推荐

  1. [普通平衡树treap]【学习笔记】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9046  Solved: 3840[Submit][Sta ...

  2. jmeter(六)元件的作用域与执行顺序

    jmeter是一个开源的性能测试工具,它可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的父子关系,那么随着它们的顺序和所在的域不同,它们在执行的时候,也会有很多不同. jmeter的test pla ...

  3. iis上如何架设HTTPS网站

    对于HTTPS网站,大部分都比较陌生,觉得很难,其实只要申请好证书,只要在服务器上做下小配置就可以完成 首先,申请一个ssl证书 免费申请https://buy.wosign.com/free/Fre ...

  4. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 忘记密码功能改进、手机短信、电子邮件

    由于我们的系统接近有100000个用户账户,经常会有忘记密码的时候,用户多了,很小的一个功能,每天都会有很多人在用,每个功能都非常友善,会提高提系统的效率,提高用户体验. 一天最多能返回3次手机短信, ...

  5. ASP.NET MVC的运行机制--url的全局分析

    全局 首先我们来看一副图片       首先,用户通过Web浏览器向服务器发送一条url请求,这里请求的url不再是xxx.aspx格式,而是http://HostName/ControllerNam ...

  6. 十分钟轻松让你认识Entity Framework 7

    EF7不是在EF6上更新,而是完全重写了.它完全支持.NET Core runtime,也就是说以后你可以在Mac或者是Linux机器上使用EF了. https://github.com/nichol ...

  7. 【三石jQuery视频教程】02.创建 FontAwesome 复选框和单选框

    视频地址:http://v.qq.com/page/m/8/c/m0150izlt8c.html 大家好,欢迎来到[三石jQuery视频教程],我是您的老朋友 - 三生石上. 今天,我们要通过基本的H ...

  8. JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)

    前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就 ...

  9. setTimeout,setInterval原理

    function a() { setTimeout(function(){alert(1)},0); alert(2); } a(); 和其他的编程语言一样,Javascript中的函数调用也是通过堆 ...

  10. jQuery.extend和jQuery.fn.extend的区别【转】

    解释的很有意思,清晰明了又有趣,转来分享下,哈哈哈 jQuery.extend和jQuery.fn.extend的区别,其实从这两个办法本身也就可以看出来.很多地方说的也不详细.这里详细说说之间的区别 ...