6-Shell的条件表达式知识初步介绍实践

文件测试表达式

文件测试表达式用法

  在讲解文件测试表达式之前,先举一个生活的例子:如果你要找老男孩老师打台球,你一定不要先去台球厅,而是会先打电话给我,问下有没有时间一起打球,同理,我们在编程时需要处理一个对象,需要对对象进行测试,只有符合要求,采取操作处理,这样做的好处就是避免程序出错以及无谓的消耗系统资源,这个要测试的对象可以是文件,字符串,数字等。 

  在书写文件测试表达式时,通常可以使用下表中的文件测试操作符

常用的文件测试操作符

常用文件测试操作符 说明
-f 文件 若文件存在且为普通文件则真
-d 文件 若文件存在且为目录文件则真
-s 文件 若文件存在且不为空(文件大小非0)则真
-e 文件 若文件存在则真,要区别-f
-r 文件 -r 文件 若文件存在且可读则真
-w 文件 若文件存在且可写则真
-x 文件 若文件存在且可执行则真
-L 文件 若文件存在且为链接文件则真
f1 -nt f2 若文件f1比文件f2新则真
f1 -ot f2 若文件f1比文件f2旧则真

特别说明:这些操作符对于[[]]、[]、test几乎是通用的,更多的操作符请man test查询

文件测试表达式举例

普通文件测试表达式举例
普通文件(测试文件类型)

[root@node1 script]# touch oldboy
[root@node1 script]# ls -l oldboy 
-rw-r--r-- 1 root root 0 Aug 29 07:44 oldboy
[root@node1 script]# [ -f oldboy ] && echo 1 || echo 0
1

目录文件(测试文件类型)

[root@node1 script]# mkdir oldgirl
[root@node1 script]# [ -f oldgirl ] && echo 1 || echo 0
0
[root@node1 script]# [ -d oldgirl ] && echo 1 || echo 0
1
[root@node1 script]# [ -e oldgirl ] && echo 1 || echo 0
1
[root@node1 script]# [ -f oldboy ] && echo 1 || echo 0
1

测试文件属性举例:

[root@node1 script]# ls -l oldboy 
-rw-r--r-- 1 root root 0 Aug 29 07:44 oldboy
[root@node1 script]# [ -r oldboy ] && echo 1 || echo 0
1
[root@node1 script]# [ -w oldboy ] && echo 1 || echo 0
1
[root@node1 script]# [ -x oldboy ] && echo 1 || echo 0
0
[root@node1 script]# chmod +x oldboy 
[root@node1 script]# [ -x oldboy ] && echo 1 || echo 0
1
[root@node1 script]# chmod 000 oldboy 
[root@node1 script]# ls -l oldboy 
---------- 1 root root 0 Aug 29 07:44 oldboy
[root@node1 script]# [ -r oldboy ] && echo 1 || echo 0   #因为该用户是root,root权限较大,对root来说不管用
1

测试shell变量举例:
首先我们定义file1和file2两个变量,并分别赋予两个系统文件路径及文件名的值

[root@node1 script]# file1=/etc/services;file2=/etc/rc.local #→分号用于分隔两个命令
[root@node1 script]# echo $file1 $file2
/etc/services /etc/rc.local

范例1:对单个文件变量的测试

[root@node1 script]# [ -f $file1 ] && echo 1 || echo 0 #→文件存在且为普通文件所以为真(1)
1
[root@node1 script]# [ -d $file1 ] && echo 1 || echo 0 #→是文件不是目录所以为假(0)
0
[root@node1 script]# [ -f "$file1" ] && echo 1 || echo 0 #→文件存在且大小不为0,所以为真(1)
1
[root@node1 script]# [ -f "$file" ] && echo 1 || echo 0 #→文件存在所以为真(1)
0

范例2:对单个目录变量的测试

[root@node1 script]# dir1=/etc/
[root@node1 script]# [ -e "$dir1" ] && echo 1 || echo 0
1
[root@node1 script]# [ -w /etc/services ] && echo 1 || echo 0
1
[root@node1 script]# su - chenxi
Last login: Thu Aug 29 07:39:00 CST 2019 on pts/0
[chenxi@node1 ~]$ [ -w /etc/services ] && echo 1 || echo 0
0

特殊例子:如果变量不加双引号。测试结果可能不正确:

[root@node1 script]# echo $file7

[root@node1 script]# [ -f "$file7" ] && echo 1 || echo 0
0
[root@node1 script]# [ -f $file7 ] && echo 1 || echo 0
1 #→明明$file7不存在还返回1

范例3:把变量内容换成实体文件路径测试

[root@node1 script]# [ -f /etc/service ] && echo 1 || echo 0
0
[root@node1 script]# [ -f /etc/services ] && echo 1 || echo 0
1
[root@node1 script]# [ -f "/etc/service" ] && echo 1 || echo 0
0
[root@node1 script]# [ -f "/etc/services" ] && echo 1 || echo 0
1

提示:如果是文件实体路径加引号与不加引号结果是一样的

范例4(生产):生产环境系统nfs启动脚本的条件测试的内容

[root@node1 init.d]# more /etc/init.d/rpcbind
# Source networking configuration.
[ -f /etc/sysconfig/network ] &&  . /etc/sysconfig/network
#→如果/etc/sysconfig/network文件存在就加载文件
# This is an interactive program, we need the current locale
[ -f /etc/profile.d/lang.sh ] && . /etc/profile.d/lang.sh  #→如果/etc/profile.d/lang.sh文件存在就加载文件

特别提示:系统脚本是我们学习编程的第一标杆,要多参考,虽然,有些也不是特别规范

范例5:简单高效的文件判断例子
在做测试判断时,不一定要按照前面的方法。直接用后者做判断有时更简洁。例如:

范例:

[root@node1 init.d]# [ -f "$file1" ] && echo 1  #条件成立返回1
1
[root@node1 init.d]# [ -f "$file1" ] && echo 0  #条件不成立返回0
0

系统范例:/etc/init.d/nfs

        [ -x /usr/sbin/rpc.nfsd ] || exit 5
        [ -x /usr/sbin/rpc.mountd ] || exit 5
        [ -x /usr/sbin/exportfs ] || exit 5

猜你喜欢

转载自www.cnblogs.com/chenyuxi1314/p/11427833.html