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