Linux Bash Shell编程(八):条件判断语句与示例
上一节中,我们了解了字符串截取和处理的相关命令,可以对命令的输出数据流进行筛选截取。本节开始,就到了Bash Shell编程最关键的部分:条件判断和流程控制语句。本节中,我们先熟悉条件判断的各种类型、形式。
条件判断的基本语法
条件判断的基本语法主要有两种:基于命令行的test
命令和更适合于嵌入流程控制语句的条件样式。
test 命令
test命令以命令行的形式运行条件判断语句,不会有任何标准输出,该语句的执行结果被保存在预定义变量$?
中(注意,$?值类似于程序返回值,而不是布尔型数据,$? 0为真,1为假),可以直接用echo
命令查看,也可被多命令逻辑关系符调用,更符合使用者的习惯,但在Shell脚本中使用不便,一般不建议在Shell中使用test 条件判断语句 #为了观察实际效果,一般使用echo命令查看$?预定义变量 echo $? #0为真,1为假
#例如:(判断语句的具体分类在下面讲到) test -e Hello_World.sh echo $?
用
[]
包含的条件样式用
[]
包含的条件判断表达式功能与test
命令相同,不采用命令式结构,可以方便地嵌入流程控制语句中作为条件,返回值同样在预定义变量$?
中,除了形式不同,其余与test
命令完全相同注意:[ ]内侧两边必须有空格,否则命令执行报错
[ 条件判断语句 ] #同样使用echo命令查看条件判断语句结果 echo $?
#例如:(判断语句的具体分类在下面讲到) [ -e Hello_World.sh ] echo $?
条件判断语句类型
按照文件类型判断
在选项后加文件名,可以判断文件(若存在)类型是否符合条件,若文件不存在直接返回假,符合条件返回真,具体文件类型判断符与ls命令结果中文件属性第一位相似
[选项 文件名]
#echo #?
选项
作用
-b
判断文件(若存在 (下同))是否为块设备文件(是为真 (下同))
-c
判断文件是否为字符设备文件
-d
判断文件是否为目录文件
-e
exist 仅判断文件是否存在
-f
file 判断文件是否为普通文件
-L
判断文件是否为符号链接文件
-p
判断文件是否为管道文件
-s
判断文件是否非空(非空为真)
-S
判断文件是否为套接字文件
按照文件权限判断
同样要在选项后加文件名,有权限为真,无权限或文件不存在为假。(判断的是当前用户对这个文件的权限)
选项
作用
-r
判断对该文件是否有读权限
-w
判断对该文件是否有写权限
-x
判断对该文件是否有执行权限
-u
判断对该文件是否有SUID权限
-g
判断对该文件/目录是否有SGID权限
-k
判断对该目录是否有SBIT权限
比较两个文件的信息
格式:文件1 [选项] 文件2
选项
作用
-nt
newer than判断文件1的最后修改时间是否比文件2晚,晚为真(0)
-ot
older than 判断文件1的最后修改时间是否比文件2早,早为真(0)
-ef
判断两个文件的Inode号是否一致,近似为两个文件是否相同
- 其中,
Inode
号是标识文件的序号,两个不同的文件可以名称相同,但Inode号不能相同,若两个文件为硬链接(保存为副本、同步更新)关系,则两文件的Inode号才会相同,其余不同 - 两个硬链接的文件,除了Inode号相同外没有任何标志,可以使用这个判断方式判断硬链接
比较两个整数
若为两个变量,不需要声明为整型格式,语法:整数1 [选项] 整数2
选项
作用
-eq
equal 判断两个整数是否相等
-ne
not equal 判断两个整数是否不等
-gt
greater than判断整数1是否大于整数2
-lt
less than 判断整数1是否小于整数2
-ge
greater/equal 判断整数1是否大于等于整数2
-le
less/equal 判断整数1是否小于等于整数2
判断字符串相关
语法包含在选项中,注意:两个字符串比较相关的判断符两边都要加空格,否则无论如何,返回值均为真
选项
作用
-z 字符串
判断字符串是否为空
-n 字符串
判断字符串是否非空
字符串1 == 字符串2
判断两个字符串是否相等
字符串1 != 字符串2
判断两个字符串是否不等
- 当字符串是变量时,如果变量没有定义,则同样视作空字符串
两个判断条件的逻辑关系
同时使用两个判断条件时,要注意它们之间的逻辑关系,两个判断条件的格式:条件1 [选项] 条件2
选项
作用
-a
逻辑与,两个条件都成立才成立
-o
逻辑或,两个条件有一个成立就成立
! [条件]
逻辑非,使判断结果取反(注意,!
与条件之间有空格)
条件判断语句与多命令逻辑符连用
关于多命令顺序与逻辑符,请参阅Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号
实际上,多命令顺序与逻辑符判断前一个命令是否执行的方式就是判断预定义变量$?
的值是否为0,所以可以直接将条件判断语句看作一个命令加入多命令顺序语句中,条件判断为真相当于正确执行了上一个语句。
示例
示例1,判断文件是否存在:
[ -e ./test.sh ] && echo "File exists" || echo "File not found"
#条件判断语句方括号内侧必须有空格
#该命令执行,若文件存在,显示"File exists";否则显示"File not found"
示例2,用多命令逻辑符构建单行比大小程序:
#以下为test5.sh中的内容
#!/bin/bash
#Author:Zheng
read -p "a= " a
read -p "b= " b #通过键盘读入a,b数据,请参阅(四)
[ $a -lt $b ] && echo "a<b" || echo "a>=b"
示例3,多条件判断语句:判断输入变量是否为空并且是否值小于10
#以下为test6.sh中内容
#!/bin/bash
#Author: Zheng
read -p "Input a: " a
#若a非空且小于10,则输出Yes
[ -n $a -a $a -lt 10 ] && echo "Yes" || echo "No"
#此脚本中未加入判断a是否为整数的条件,留待改进
索引
下一节,我们将学习Bash流程控制语句