条件测试:

判断某需求是否满足,需要由测试机制来实现;


如何编写测试表达式以实现所需的测试:

(1) 执行命令,并利用命令状态返回值来判断;

     $?:命令状态返回值

     0:成功

     1-255:失败

(2) 测试表达式

     test  EXPRESSION

     [ EXPRESSION ]

     ` EXPRESSION `

    注意:EXPRESSION两端必须有空白字符,否则为语法错误;

示例:

[root@wlm tmp]# touch a
[root@wlm tmp]# [ -f a ]
[root@wlm tmp]# echo $?
0
[root@wlm tmp]# [ -d a ]
[root@wlm tmp]# echo $?
1
[root@wlm tmp]# test -f a
[root@wlm tmp]# echo $?
0
[root@wlm tmp]# [[ -d $? ]]
[root@wlm tmp]# echo $?
1



bash的测试类型:

数值测试

字符串测试

文件测试




数值测试:数值比较

     -eq:是否等于; [ $num1 -eq $num2 ]

     -ne:是否不等于;

     -gt:是否大于;

     -ge:是否大于等于;

     -lt:是否小于;

     -le:是否小于等于;


字符串测试:

     ==:是否等于;

     >:是否大于;

     <:是否小于;

     !=:是否不等于;

     =~:左侧字符串是否能够被右侧的PATTERN所匹配;

    

     -z "STRING":判断指定的字串是否为空;空则为真,不空则假;

     -n "STRING":判断指定的字符串是否不空;不空则真,空则为假;


注意:

     (1) 字符串要加引用;

     (2) 要使用` `;


文件测试

存在性测试

     -a  FILE

     -e  FILE

    文件的存在性测试,存在则为真,否则则为假;

存在性及类型测试

     -b  FILE:是否存在并且为 块设备 文件;

     -c  FILE:是否存在并且为 字符设备 文件;

     -d  FILE:是否存在并且为 目录文件;

     -f  FILE:是否存在并且为 普通文件;

     -h  FILE或 -L  FILE:是否存在并且为 符号链接文件;

     -p FILE:是否存在且为 命名管道文件;

     -S  FILE:是否存在且为 套接字文件;

文件权限测试:

     -r  FILE:是否存在并且 对当前用户可读;

     -w  FILE:是否存在并且 对当前用户可写;

     -x  FILE:是否存在并且 对当前用户可执行;

特殊权限测试:

     -u  FILE:是否存在并且 拥有suid权限;

     -g  FILE:是否存在并且 拥有sgid权限;

     -k  FILE:是否存在并且 拥有sticky权限;

文件是否有内容:

    -s  FILE:是否有内容;

时间戳:

    -N FILE:文件自从上一次读操作后是否被修改过;

从属关系测试:

    -O  FILE:当前用户是否为文件的属主;

    -G  FILE:当前用户是否属于文件的属组;

双目测试:

     FILE1  -ef  FILE2:FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接;

     FILE1  -nt  FILE2:FILE1是否新于FILE2;

     FILE1  -ot  FILE2:FILE1是否旧于FILE2;



组合测试条件:

逻辑运算:

第一种方式:

COMMAND1 && COMMAND2

COMMAND1 || COMMAND2

! COMMAND 


[ -O FILE ] && [ -r FILE ]


第二种方式:

EXPRESSION1  -a  EXPRESSION2

EXPRESSION1  -o  EXPRESSION2

! EXPRESSION


[ -O FILE -a -x FILE ]



练习:将当前主机名称保存至hostName变量中;主机名如果为空,或者为localhost.localdomain,则将其设置为wlm;

[root@wlm tmp]# hostName=$(hostname)
[root@wlm tmp]# hostname
localhost
[root@wlm tmp]# echo $hostName 
localhost
[root@wlm tmp]# [ -z "$hostName" -o "$hostName" == "localhost" -o "$hostName" == "localhost.localdomain" ] && hostname wlm
[root@wlm tmp]# echo $?
0
[root@wlm tmp]# hostname
wlm