shell脚本的条件判断2:文件属性的判断与比较

news/2024/7/8 3:08:22 标签: linux, 运维, 服务器

一 文件属性的判断与比较

Shell支持大量对文件属性的判断,常用的文件属性操作符很多,如下表所示。更多文件属性操作符可以参考命令帮助手册(man test)。

二 实例 

实例:文件和目录判断 

 可以创建新的文件,也可以使用已有的文件进行测试。

 判断文件是否存在:

root@ubuntu:/home/csdn# [ -e main.c ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# [ -e nofile.c ] && echo Y || echo N
N
root@ubuntu:/home/csdn# [ ! -e nofile.c ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# [ ! -e main.c ] && echo Y || echo N
N
root@ubuntu:/home/csdn#

目录判断:hello是一个目录


root@ubuntu:/home/csdn# [ -e hello ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# [ -f hello ] && echo Y || echo N
N
root@ubuntu:/home/csdn# [ -d hello ] && echo Y || echo N
Y
root@ubuntu:/home/csdn#

实例:块设备测试 

下面这个测试,假设系统中有某个磁盘设备,使用-b测试该设备是否存在,且当该设备为块设备时返回值为Y,否则返回值为N。

root@host:~# [ -b /dev/mmcblk1p2 ] && echo Y || echo N
Y
root@host:~# [ -b /dev/mmcblk1p1 ] && echo Y || echo N
Y
root@host:~# [ -b /dev/mmcblk1p3 ] && echo Y || echo N
N
root@host:~#

实例:软/硬链接判断 

 Linux系统中的文件链接分为软链接和硬链接两种。软链接创建后,如果源文件被删除,则软链接将无法继续使用,可以跨分区和磁盘创建软链接。硬链接创建后,如果源文件被删除,则硬链接依然可以正常使用、正常读写数据,但硬链接不可以跨分区或磁盘创建。另外,硬链接与源文件使用的是相同的设备、相同的inode编号。使用ls -l(小写字母L)命令查看硬链接文件的属性时,文件属性与普通文件是一样的,而软链接的文件属性则可以看到被l(小写字母L)标记,表示该文件为软链接。

虽然文件main.c不存在,但是依然可以创建一个指向它的软链接 

root@host:~# ln -s main.c softlink.c
root@host:~# ls -l main.c softlink.c
ls: main.c: No such file or directory
lrwxrwxrwx    1 root     root             6 Jan  1 05:55 softlink.c -> main.c
root@host:~#

 此时指向的main.c是红色的

 使用touch创建了一个main.c,链接颜色正常了

判断软链接: 

root@host:~# [ -L softlink.c ] && echo Y || echo N
Y
root@host:~#

硬链接判断:

root@host:~# ln main.c hard.c
root@host:~# [ -f hard.c  ] && echo Y || echo N
Y
root@host:~# [ -L hard.c  ] && echo Y || echo N
N
root@host:~#

在测试权限时需要注意,超级管理员root在没有rw权限的情况下,也是可以读写文件的,rw权限对超级管理员是无效的。但是如果文件没有x权限,哪怕是root也不可以执行该文件。

root@host:~# ls -l main.c
-rw-rw-rw-    2 root     root             0 Jan  1 05:58 main.c
root@host:~# chmod -rw main.c
root@host:~# ls -ls main.c
     1 ----------    2 root     root             6 Jan  1 06:06 main.c
root@host:~# echo "hello" > main.c
root@host:~# cat main.c
hello
root@host:~# ./main.c
-sh: ./main.c: Permission denied
root@host:~#

为了获得相对可参考的值,切换用户为普通用户:

 测试之前,文件main.c可读可写,通过chmod -rw后,文件不可读,不可写。

csdn@ubuntu:~$ ls -ls main.c
4 -rw-rw-r-- 1 csdn csdn 93 11月 26 11:04 main.c
csdn@ubuntu:~$ [ -r main.c ] && echo Y || echo N
Y
csdn@ubuntu:~$ [ -w main.c ] && echo Y || echo N
Y
csdn@ubuntu:~$ [ -x main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ chmod -rw main.c
csdn@ubuntu:~$ [ -r main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ -w main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ -x main.c ] && echo Y || echo N
N
csdn@ubuntu:~$

实例:判断文件非空 

 默认touch命令创建的文件都是空文件,在使用-s测试文件是否为非空文件时,因为文件是空文件,所以测试结果为假。当文件中有内容时,测试文件是否为非空时,结果为真。

root@host:~# [ -s newfile ] && echo Y || echo N
N
root@host:~# echo "hehe" > newfile
root@host:~# ls -ls newfile
     1 -rw-rw-rw-    1 root     root             5 Jan  1 06:09 newfile
root@host:~# [ -s newfile ] && echo Y || echo N
Y
root@host:~#

实例:对比文件时间 

现在可以使用测试条件判断两个文件的创建时间,看看哪个文件是新文件,哪个文件是旧文件。new than表示更新,old than表示更旧。根据下面的输出结果可知,main.c文件比other.c文件更旧。 

首先,看下两个文件的信息: 

csdn@ubuntu:~$ ls main.c other.c -ls
4 ---------- 1 csdn csdn 93 11月 26 11:04 main.c
4 -rw-rw-r-- 1 csdn csdn 89 11月 26 11:10 other.c
csdn@ubuntu:~$

 文件main.c比other.c更旧

csdn@ubuntu:~$ [ main.c -nt other.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ main.c -ot other.c ] && echo Y || echo N
Y
csdn@ubuntu:~$

文件main.c自己和自己比呢?既不新也不旧。

csdn@ubuntu:~$ [ main.c -ot main.c ] && echo Y || echo N
N
csdn@ubuntu:~$ [ main.c -nt main.c ] && echo Y || echo N
N
csdn@ubuntu:~$

 小结


http://www.niftyadmin.cn/n/11924.html

相关文章

【JVM技术专题】「原理专题」全流程分析Java对象的创建过程及内存布局

前言概要 对应过程则是:对象创建、对象内存布局、对象访问定位的三个过程。 对象的创建过程 对象的创建方式 java中对象的创建方式有很多种,常见的是通过new关键字和反射这两种方式来创建。除此之外,还有clone、反序列化等方式创建。 通过n…

NOIP 2022 游记

Day -8 CSP 回来半个月 loj 做题数猛涨 120,然而要说学会了什么似乎也没有。 耳机里都是初中时代的歌,疯狂怀念。 实验楼要装修,与 410 匆忙告别。 班级调坐,喜提单座。冥思苦想了半天原来有人提前去中科大了。后来又有人回了…

Java自幂数计算及其算法改进

文章目录1. 自幂数2.自幂数的个数3. 常规自幂数计算方法4.算法代码改进1. 自幂数 如果在一个固定的进制中,一个n位自然数等于自身各个数位上数字的n次幂之和,则称此数为自幂数。 例如:在十进制中,153是一个三位数,各个…

回归分析(1)-回归分析的基本概念

1.回归方程 由于x是可控的非随机变量, 而Y 是一个与x有关的随机变量,因此,直接研究变量Y与x之间的相关关系是困难的. 如果注意到随机变量Y的数学期望反映了随机变量Y的平均取值,因此, 可考虑研究EY与x之间的…

java计算机毕业设计高校迎新管理系统源码+mysql数据库+系统+lw文档+部署

java计算机毕业设计高校迎新管理系统源码mysql数据库系统lw文档部署 java计算机毕业设计高校迎新管理系统源码mysql数据库系统lw文档部署本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术&a…

Google Earth Engine(GEE)——样本点提取间隔距离500米提取样本点

假设您已经有了点,只想选择一个满足缓冲标准的子集。在这种情况下,您可以在随机图像上使用 reduceRegions 和最大缩减器,按细胞图像分组。 max reducer 将允许您指定额外的输入(例如:协变量或像素坐标)以携带它找到的任何最大值。 原有代码: var geometry = /* color:…

Git使用教程

Git使用教程 更好的阅读体验 从大一就开始用git了,但是一直以来都是想到哪用到哪,时间一长一些命令就容易忘,这次就系统地记录一下git命名,也方便后续查询 在这里推荐一个可视化学习Git的网站 Git学习 Git基本概念 git工作区…

Java#25(常见算法: 查找算法)

目录 一.基本查找/顺序查找 从0索引开始挨个往后找 二.折半查找/二分查找 条件: 数组中的数据必须是有序的 核心逻辑: 每次排查一半的查找范围 优势: 提高查找效率 三.分块查找 分块查找的原则1: 前一块中的最大数据,小于后一块中所有的数据(块内无序,块间有序) 分块查…