1.3 Shell脚本条件测试

布尔变量中真为0,假为1。所以可以根据测试机制来判断语句的返回值。测试机制可以使用下面语法实现:

    test 表达式 [ 表达式 ][[ 表达式 ]],表达式前后必须有空格

    注意: 表达式一般用于[[ ]]中;扩展的正则表达式

    根据命令的返回值,可以使用逻辑运算让语句有条件的运行。

#!/bin/bash
#计算第一个文件中空行数
[ "$#" -ge 1 ] \
	&& { Space="`grep -c "^[[:space:]]*$" $1`"; echo "Blank line have: "$Space; } \
	|| { echo "Enter at least a file"; exit; }

数字测试

    数值测试可以判断数值之间的大小关系。

    表达式

-v VAR:变量VAR是否使用(CentOS 7可用)

[root@CentOS7 ~]# a=3
[root@CentOS7 ~]# echo $a
3
[root@CentOS7 ~]# [ -v a ] && echo set || echo no set
set
[root@CentOS7 ~]# unset a
[root@CentOS7 ~]# [ -v a ] && echo set || echo no set
no set
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于

字符测试

    用于字符测试中的操作数应该使用双引号标识。

[root@CentOS7 ~]# a=abc
[root@CentOS7 ~]# echo $a
abc
[root@CentOS7 ~]# [ "abc" == "$a" ] && echo yes || echo no
yes
[root@CentOS7 ~]# a=""
[root@CentOS7 ~]# [ "x" == x"$a" ] && echo empty || echo unempty   #常用于判断一个变量是否为空
empty

    表达式

== 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN所匹配
-z "STRING“ 字符串是否为空,空为真,不空为假
-n "STRING“ 字符串是否不空,不空为真,空为假

#!/bin/bash
#判断磁盘利用率和inode使用率,超过80%报警
diskfree="`df | tr -s " " % | cut -d% -f5 | grep -o "[0-9]*" | sort -rn | head -1 `"
inodefree="`df -i | tr -s " " % | cut -d% -f5 | grep -o "[0-9]*" | sort -rn | head -1 `"

[ "$diskfree"  -ge 80 ] \
	&& wall "The disk will full!" \
	|| echo -e "\e[32;1mThe disk is healthy!\e[0m"
[ "$inodefree" -ge 80 ] \
	&& wall "The inode will full!" \
	|| echo -e "\e[32;1mThe inode is healthy!\e[0m"

文件

    存在性测试

-e FILE: 文件存在性测试,存在为真,否则为假
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或 -L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件

[root@CentOS7 ~]# [ -e /etc/passwd ] && echo exist 
exist

    权限测试

-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限

[root@CentOS7 ~]# [ -u /bin/passwd ] && echo SUID
SUID

    文件大小测试

-s FILE: 是否存在且非空
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
[root@CentOS7 ~]# [ -O /etc/passwd ] && echo yes || echo no
yes

    双目标测试

FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
FILE1 -nt FILE2: FILE1是否新于FILE2(比较mtime)

FILE1 -ot FILE2: FILE1是否旧于FILE2

#!/bin/bash
#判断参数文件是否是“.sh”后缀的文件,是的话添加执行权限
[ -f $1 -a ! -x $1 ] || { echo "$1 not is a file"; exit; } 
echo "$1" | grep ".*[.]sh$" >> /dev/null
[ $? -eq 0 ] \
	&& { chmod +x $1; echo "Set up!"; } \
	|| echo "$1 not is a script"



你可能感兴趣的:(shell脚本)