条件判断工具 test or [ ]

概述

        条件判断是学习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

(0)
fackerfacker
上一篇 2016-02-14
下一篇 2016-02-14

相关推荐

  • Linux磁盘管理命令

    Linux有着管理各种存储设备的强大能力。Linux把所有磁盘都当作文件管理,从而简化我们对其进行的读写等操作。 IDE接口的硬盘在Linux中命名为:/dev/hd{a|b|c……},比如/dev/hda; 其他硬盘比如SATA接口的硬盘命名为:/dev/sd{a|b|c……},比如/dev/sda。 注:{…

    Linux干货 2015-12-06
  • 使用Storm实现实时大数据分析

    摘要:随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战。Shruthi Kumar和Siddharth Patankar在Dr.Dobb’s上结合了汽车超速监视,为我们演示了使用Storm进行实时大数据分析。CSDN在此编译、整理。 简单和明了,Storm让大数据分析变得轻松加愉快。 当今世界,公司的日常运营经常会生成TB级别的数据。数据来源…

    Linux干货 2015-04-04
  • Shell脚本编程之入门基础(一)

    Shell脚本编程   一、本章节一内容:    编程基础    脚本基本格式    变量    运算    条件测试   在本章节开始之前,我们先回顾下前面的知识点内容。前面学习了Linux的基础入门,了解到计算机是运行二进制指令的,而我…

    Linux干货 2016-08-12
  • Linux的诞生史

    Linux诞生史 远古记忆-UNIX的诞生 Multics计划—开始 这是由麻省理工学院,通用电气和AT&T的贝尔实验室合作的操作系统项目,用于使用在GE-645大型主机上的。但是由于整个目标过于庞大,Multics虽然发布了一些产品,但是性能都很低,AT&T退出了Mulitcs项目,计划终止。肯.汤姆逊当时也参加了这个项目,很不…

    2017-07-11
  • 马哥教育网络班21期第6周作业

    1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; %s/^[[:space:]]\+/#& 2、复制/boot/grub/grub.conf至/tmp目录中,删除/tmp/grub.conf文件中的行首的空白字符; %s/^[[:space:]]\+/ …

    Linux干货 2016-12-05
  • ansible的用法

    ansible 每台主机拥有不同的功能,可能同时是http服务器,php-fpm的客户端,共享存储的客户端等,这些功能是单独定义的,不同主机需要的功能各不相同 应确保目标主机的状态为事先给他定义的目标状态 使目标主机达到目标状态有两种方法      agentless:由服务端主机通过ssh连接到目标主机执行命令,客户端不需要额…

    Linux干货 2016-11-11

评论列表(1条)

  • stanley
    stanley 2016-02-14 10:13

    内容专业,排版漂亮,已置顶