【重点】Shell入门教程:流程控制(3)条件判断式的真假值
之前曾提到,在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)条件判断式的真假值的更多相关文章
- 廖雪峰Java1-3流程控制-3条件判断
1.if条件判断的格式 if (条件) { 代码块 } if (条件) { 代码块1 } else { 代码块2 } if (条件1) { 代码块1 } else if { 代码块2 } else { ...
- Python流程控制-2 条件判断
条件判断 条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块. 在Python语法中,使用if.elif和else三个关键字来进行条件判断. if语句的一般形式如下 ...
- shell编程 之 流程控制(条件语句和循环语句)
1 if ...else... 基本格式: if condition then commend else commend fi 当然也可以写到一行,用[ ]表明边界,用:表示分行.比如: if [ $ ...
- ansible-playbook流程控制-when条件判断
1. ansible-playbook添加判断 when相当于shell脚本里的if 判断,when语句就是用来实现这个功能的,它是一个jinja2的语法,但是不需要双大括号,用法很简单 1 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Shell入门教程:流程控制(1)命令的结束状态
在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环 ...
- Shell命令和流程控制
Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...
- shell脚本之流程控制
shell脚本之流程控制 shell脚本之流程控制 条件语句 条件判断 循环语句for,while,until for循环 while循环 until循环 循环控制语句continue 循环控制语 ...
- Python3.7.4入门-2流程控制工具
2 流程控制工具 记得在语句后加冒号 2.1 while # Fibonacci series: # the sum of two elements defines the next a, b = 0 ...
随机推荐
- 洛谷P1101 单词方阵——S.B.S.
题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red ...
- ORACLE数据库存储空间使用情况查询
使用系统sys或者dba权限的账户创建视图如下: 1. 主要从数据库的表dba_data_files,dba_segments两张表中获取.2. 默认数据库保存的是byte单位,转换关系如下: 102 ...
- Hibernate 延迟加载和立即加载
概念 什么是延迟加载:所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.可以简单理解为,只有在使用的时候,才会发出sql语句进行查询,数据是分N次读取. 什么是立即加载:所谓立即加载既是 ...
- org.hibernate.HibernateException: No Session found for current thread
spring.springmvc和hibernate整合 在sessionFactory.getCurrentSession()时,出现以下异常 No Session found for curren ...
- StackExchange.Redis 访问封装类
最近需要在C#中使用Redis,在Redis的官网找到了ServiceStack.Redis,最后在测试的时候发现这是个坑,4.0已上已经收费,后面只好找到3系列的最终版本,最后测试发现还是有BUG或 ...
- asp.net(C#)网站发布后 Global.asax 里 Application_Error 不执行的问题
现象 在 Global.asax 用 Application_Error 捕捉了http的404,500等错误,在本机测试正常,发布后无效,几经周折终于解决了... 程序是这样设计的 Applicat ...
- Win10系统出问题?简单一招即可修复win10!
时至今日,win10系统的普及率越来越高,在微软多种策略的强推下,10月份win10系统的市场份额已达22.59%,但win10系统也不是完美的,总有些还是会出现一些诸如打开应用程序出现闪退.乱码.总 ...
- Winform开发:在ProgressBar显示百分比数字
如果不使用Label而是直接在进度条上显示文字,可以扩展一个派生类自己画,代码如下: public partial class Form1 : Form { public Form1() { Init ...
- Python基础-三次用户验证登录购买商品程序
需求: 一:三次登录锁定 1.用户信息存放于文件中 2.尝试三次都失败,锁定用户 二.购物车功能要求: 要求用户输入总资产,例如:2000显示商品列表,让用户根据序号选择商品,加入购物车购买,如果商品 ...
- Delphi 实现数字转大写
从网上找的一段代码 /// <summary> /// 小写转大写 /// </summary> /// <param name="mmje"> ...