布尔变量中真为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
文件大小测试
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
[root@CentOS7 ~]# [ -O /etc/passwd ] && echo yes || echo no
yes
双目标测试
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"