测试是判断命令的执行过程,返回0则判断为真,返回非0则判断为假。
1. 测试语法结构
第一种结构,命令的格式如下:
test expression
expression是一个表达式,可以是算术比较、字符串比较、文本和文件属性比较等。
第二种结构,命令的格式如下
注意,左边的括号“[”后有个空格,右括号“]”前面也有个空格。
[ expression ]
2. 文件测试
“测试文件是否存在”就是“文件测试”的一种典型需求,其格式如下:
#文件测试方法一
test file_operator FILE
#文件测试方法二
[ file_operator FILE ]
其中file_operator是文件测试符(如下图),FILE是文件、目录(可以是文件或目录的全路径)。
判断文件是否存在
lianggao@bogon ~ % [ -e MyWorkSpace/001project/wcJava.zip ]
lianggao@bogon ~ % echo $?
0
判断文件是否可读、写、执行。
[root@tbds-10-1-0-38 log]# cat rxx.sh
#!/bin/bash
#read命令用于从标准输入读取数值。-p:后面跟提示信息,即在输入前打印提示信息。
read -p "what file do you want to test" filename
if [ ! -e "$filename" ]; then
echo "the file does not exits"
exit 1
fi
if [ -r "$filename" ]; then
echo "$filename can read"
fi
if [ -w "$filename" ]; then
echo "$filename can write"
fi
if [ -x "$filename" ]; then
echo "$filename can excute"
fi
[root@tbds-10-1-0-38 log]# bash rxx.sh
what file do you want to test ./rxx.sh
./rxx.sh can read
./rxx.sh can write
[root@tbds-10-1-0-38 log]# bash rxx.sh
what file do you want to test /11.txt
the file does not exits
3. 字符串测试
Shell中的字符串比较主要有等于、不等于、大于、小于、是否为空等测试。
字符串测试符
[root@docp82 ~]# str1=""
[root@docp82 ~]# str2="hello"
[root@docp82 ~]# [ -z "${str1}" ]
[root@docp82 ~]# echo $?
0
[root@docp82 ~]# [ -z "${str2}" ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [ "${str2}" = "${str1}" ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [ "${str2}" != "${str1}" ]
[root@docp82 ~]# echo $?
0
//存在转义的情况
[root@docp82 ~]# [ "${str2}" > "${str1}" ]
-bash: : No such file or directory
[root@docp82 ~]# [ "${str2}" \> "${str1}" ]
[root@docp82 ~]# echo $?
0
[root@docp82 ~]# [ "${str2}" \< "${str1}" ]
[root@docp82 ~]# echo $?
1
- 需要使用""接收${str1}的变量值
- 比较大小时,注意 > 和 < 都需要进行转义。
4. 整数测试
整数测试是一种简单的算术运算,作用在于比较两个整数的大小关系,测试成立则返回0,否则返回非0值。
#整数测试方法一
test "num1" num_operator "num2"
#整数测试方法二
[ "num1" num_operator "num2" ]
[root@docp82 ~]# num1=1
[root@docp82 ~]# num2=2
[root@docp82 ~]# [ "$num1" -gt "$num2" ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [ "$num1" -lt "$num2" ]
[root@docp82 ~]# echo $?
0
[root@docp82 ~]# [ "$num1" -eq "$num2" ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [ "$num1" -ne "$num2" ]
[root@docp82 ~]# echo $?
0
5. 逻辑测试符和逻辑运算符
逻辑测试符(不推荐)
逻辑运算符(推荐)
使用逻辑运算符去判断
[root@localhost ~]# ! [-e /var/log/messages ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [-e /var/log/messages ] && [-e /var/log/messages01 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [-e /var/log/messages ] || [-e /var/log/messages01 ]
[root@localhost ~]# echo $?0
不管是逻辑运算符还是逻辑测试符,在做逻辑与、逻辑或运算时逻辑都是一样的。
多逻辑运算符使用
将逻辑与、逻辑或的这些特点联合起来使用,使用的方式如下:
expression && DoWhenExpressionTrue || DoWhenExpressionFalse
从左到右,首先计算expression,并返回其值。如果返回真,继续执行&&后的代码DoWhenExpressionTrue,如果该语句执行成功,则expression &&DoWhenExpressionTrue整体返回0,使用||连接的DoWhenExpressionFalse代码将不会被执行;
如果expression返回假,则跳过DoWhenExpressionTrue,则用||连接的代码段DoWhenExpressionFalse一定会被执行。
上述代码段其实就是一个隐形的if-then-else语法。