目录
一、条件测试的基本语法
二、文件测试表达式
三、字符串测试表达式
四、整数测试表达式
五、逻辑操作符
六、实验
为了能够正确处理 Shell 程序运行过程中遇到的各种情况, Linux Shell 提供了一组测试运算符。 通过这些运算符,Shell 程序能够 判断某种或者几个条件是否成立 。条件测试在各种流程控制语句,例如判断语句和循环语句中发挥了重要的作用,所以,了解和掌握这些条件测试是非常重要的
一、条件测试的基本语法
条件测试语法 | 说明 |
test <测试表达式> |
test
命令和
<
测试表达式
>
之间至少有一个空格
|
[ 测试表达式 ] |
[ ]
的边界和内容之间至少有一个空格
|
[[ 测试表达式 ]] |
[[ ]]
的边界和内容之间至少有一个空格。
[[]]
中可以使用通配符等进行模式匹配
|
((测试表达式)) |
一般用于
if
语句里,双小括号两端不需要有空格,测试对象只能是整数
|
二、文件测试表达式
常用的文件测试操作符
|
说明
|
-a/-e 文件 | 文件是否存在 |
-b 文件 |
文件是否存在,且为块文件,如果文件存在且是一个块文件,则结果为0
|
-c 文件
|
文件是否存在且为字符文件,如果文件存在且是一个字符文件,则结果为0
|
-L 文件
|
文件存在且为链接文件则为真
|
-d 文件
|
文件存在且为目录则为真,即测试表达式成立
|
-f 文件
|
文件存在且为普通文件则为真,即测试表达式成立
|
-s 文件
|
文件存在且文件大小不为
0
则为真
|
-u 文件
|
文件是否设置
suid
位,如果设置了
suid
,则结果为
0
|
-r文件 |
文件存在且可读为真
|
-w 文件
|
文件存在且可写为真
|
-x 文件
|
文件存在且可执行则为真
|
f1 -nt f2
,
nt为
newer than
|
文件
f1
比文件
f2
新则为真,根据文件的修改时间来计算 stat 文件或目录查看时间
|
f1 -ot f2
,
ot
为
older than
|
文件
f1
比文件
f2
旧则为真,根据文件的修改时间来计算
|
三、字符串测试表达式
常用字符串测试操作
符
|
说明
|
-n “
字符串”
|
若字符串的长度不为
0
,则为真,即测试表达式成立,
n
可以理解为
no zero
|
-z “字符串”
|
若字符串的长度为
0
,则为真,
z
可以理解为
zero。可以用来判断是否为空
|
“
串
1”=“
串
2”
|
若字符串
1
等于字符串
2
,则为真,可使用
==
代替
=
|
“
串
1”!=“
串
2”
|
若字符串
1
不等于字符串
2
,则为真
|
四、整数测试表达式
在
[ ]
以及
test
中使用的比较符
号
|
在
(( ))
和
[[ ]]
中使用的比较符
号
|
说明
|
-eq | ==或= | 相等,equal |
-ne | != | 不相等,not equal |
-gt | > | 大于,greater than |
-ge | >= | 大于等于,greater equal |
-lt | < | 小于,less than |
-le | <= | 小于等于,less equal |
五、逻辑操作符
在
[ ]
中使用的逻辑操
作符
|
在
test
、
[[ ]]
和
(( ))
中使用的逻辑操
作符
|
说明
|
-a | && |
and
,与,两端都为真,则结果为真
|
-o | || |
or
,或,两端有一个为真,则结果为真
|
! | ! |
not
,非,两端相反,则结果为真
|
使用&&等符号的错误示例:&&不能用在 [ ] 中
[root@localhost test3] # [ -f ceshi && -f file ];echo $?-bash : [: missing `]'2[root@localhost test3] # [ -f ceshi || -f file ];echo $?-bash : [: missing `]'-bash : -f : command not found127使用 && 等符号的正确示例:[root@localhost test3] # [ -f file ] && [ -f ceshi ];echo $?1[root@localhost test3] # [ -f file ] || [ -f ceshi ];echo $?0[root@localhost test3] # [ -f file ] || [ -d ceshi ];echo $?
六、实验
实验1: 让用户输入一个文件名,并做如下判断:
(
1
)如果用户输入的文件为空时显示:
you must input a filename
,并中断程序;
(
2
)如果用户输入的文件不存在时,显示
the file do not exist
,并中断程序;
(
3
)如果文件存在,判断该文件的文件类型和执行者对该文件所拥有的的权限。
说明:由于
root
在很多权限的限制上面都是无效的,所以使用
root
执行这个脚本时,常常会发现与
ls -l
的结果不相同。所以建议使用一般用户来执行这个脚本。
#! /bin/bash
read -p "please input filename:" file
[ -z $file ] && echo "you must input a filename!!!"&& exit
[ ! -e $file ] && echo "the $file do not exit."&& exit
[ -b $file ] && echo "the $file is block"
[ -d $file ] && echo "the $file is dir"
[ -f $file ] && echo "the $file is file"
[ -r $file ] && echo "has a read previlege"
[ -w $file ] && echo "has a write previlege"
[ -x $file ] && echo "has a execute previlege"
[ ! -r $file -a ! -w $file -a ! -x $file ] && echo "is not any previlege"
~
测试:
实验2: 通过read传入一个数字,如果传入的数字等于1,就打印1;如果等于2,就打印2,如果不等于1 也不等于2,就提示输入不对,然后退出程序。
实验3:通过read读入两个整数,并比较他们的大小
实验4:选择一个用户输入,判断是root账户还是系统账户还是普通账户
实验5:给定文件/etc/sos/sos.conf,判断是否存在空白行,若存在则显示行 数,否则显示“无空白行”提示信息
下面判断大小时:[ $num -gt 0 ] 可以写成(($num > 0))