概述
条件判断是学习shell脚本之前要掌握的重点基础。条件判断分为以下几类:文件判断、数值判断、字符判断。而文件判断还可以细分到:文件类型判断、文件权限判断、文件所属判断、文件之间属性判断;
举个例子,如果我们要判断/tmp下是否存在facker这个目录或文件,可以结合&&和||命令来获取到结果:
[facker@facker6 tmp]$ test -e facker && echo "file exit." || echo "file not found." file not found. [facker@facker6 tmp]$ ls fstab functions grub.conf [facker@facker6 tmp]$
从结果中回显可以看到,在我的/tmp目录下的确是不存在facker的目录或文件。可以看出,-e这个东东是测试文件的存在与否的,那还有没有其它EXPRESSION呢,答案是有的。
test语法如下:
[facker@facker6 tmp]$ test EXPRESSION FILENAME #上面说的-e就是这里的EXPRESSION啦!
还有另外的一种语法格式:
[facker@facker6 tmp]$ [ EXPRESSION FILENAME ]
1、文件类型判断
EXPRESSION | 作用 |
-e |
判断文件是否存在 |
–b | 判断文件是否存在,并且是否为普通文件 |
-d |
判断文件是否存在,并且是否为目录 |
-b | 判断文件是否存在,并且是否为块设备文件(block file) |
-c | 判断文件是否存在,并且是否为字符设备文件 |
-L | 判断文件是否存在,并且是否为符号连接文件 |
-p | 判断文件是否存在,并且是否为管道文件 |
-s | 判断文件是否存在,并且是否为空文件 |
-S | 判断文件是否存在,并且是否为套接字文件 |
2、按照文件权限来判断
EXPRESSION |
作用 |
-r |
判断文件是否存在,且对当前操作用户是否拥有读权限 |
-w | 判断文件是否存在,且对当前操作用户是否拥有写权限 |
-x |
判断文件是否存在,且对当前操作用户是否拥有执行权限 |
-u | 判断文件是否存在,并且SUID是否置位 |
-g | 判断文件是否存在,并且SGID是否置位 |
-k | 判断文件是否存在,并且SBit是否置位 |
3、按照文件被操作后的判断
EXPRESSION |
作用 |
-t fd |
判断文件是否存在,且文件的描述符是否已经打开并且与某终端相关 |
-N | 判断文件是否存在,且文件最后一次被读取时内容是否修改 |
-O |
判断文件是否存在,且当前操作用户是否为文件的属主 |
-G | 判断文件是否存在,且文件与当前操作用户是否为同一个属组 |
4、两个文件之间进行比较(双目比较)
EXPRESSION |
作用 |
文件1 -nt 文件2 |
判断文件1的修改时间是否比文件2的新(多用于配置文件备份) |
文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2的旧 |
文件1 -ef 文件2 | 判断文件1和文件2的inode号是否一致(判断是否为硬链接) |
5、两个整数之间进行比较(双目比较)
EXPRESSION |
作用 |
整数1 -eq 整数2 |
判断整数1和整数2是否相等 |
整数1 -ne 整数2 | 判断整数1和整数2是否不等 |
整数1 -gt 整数2 | 判断整数1是否大于整数2 |
整数1 -lt 整数2 | 判断整数1是否小于整数2 |
整数1 -ge 整数2 | 判断整数1是否大于等于整数2 |
整数1 -le 整数2 | 判断整数1是否小于等于整数2 |
6、两个字符串之间进行比较
EXPRESSION |
作用 |
-z 字符串 |
判断字符串是否为空 |
-n 字符串 |
判断字符串是否为非空 |
字符串1 == 字符串2 |
判断字符串1是否和字符串2相等 |
字符串1 != 字符串2 | 判断字符串1是否和字符串2不相等 |
字符串1 > 字符串2 | 判断字符串1是否大于字符串2 |
字符串1 < 字符串2 | 判断字符串1是否小于字符串2 |
字符串1 ~= 字符串2 | 判断字符串1能否被右侧的PATTERN所匹配,该表达式写为 [[ 字符串1 ~= 字符串2 ]] |
多重条件判断
EXPRESSION |
作用 |
判断1 -a 判断2 |
逻辑与,判断1和判断2都成立,结果为真 |
判断1 -o 判断2 |
逻辑或,判断1和判断2有一个成立,结果为真 |
! 判断 |
逻辑非,使原始的判断式取反 |
练习
好了,干货分享完了,我们来几道练习来验证一下是不是真的可行吧。
习题1:测试文件test.conf是否要比test.conf.bak新,如果是,则更新test.conf.bak。
[facker@facker6 tmp]$ touch test.conf test.conf.bak #通过touch命令创建两个空白文件 [facker@facker6 tmp]$ echo 123 > test.conf #向test.conf文件写入123 [facker@facker6 tmp]$ cat test.conf test.conf.bak 123 [facker@facker6 tmp]$ [ test.conf -nt test.conf.bak ] && cp -f test.conf test.conf.bak || echo "File not change." [facker@facker6 tmp]$ cat test.conf test.conf.bak #如果两个文件一致,则会输出两行123 123 123
习题2:测试当前用户是否对/etc/shadow文件是否拥有读写权限。
[facker@facker6 tmp]$ whoami facker [facker@facker6 tmp]$ ls -ld /etc/shadow ---------- 1 root root 848 Dec 20 19:06 /etc/shadow #shadow文件对于当前用户来说是既不可读也不可写的 [facker@facker6 tmp]$ [ -r /etc/shadow -o -w /etc/shadow ] && echo "i can read or write this file." || echo "i do not have permission." i do not have permission. [facker@facker6 tmp]$
参考资料
-
《马哥Linux教学》
-
《鸟哥私房菜基础篇》
原创文章,作者:facker,如若转载,请注明出处:http://www.178linux.com/10312
评论列表(1条)
内容专业,排版漂亮,已置顶