1. test命令初识

1.1 定义

shell中的test命令用于检查某个条件是否成立,它可以进行数值字符文件三个方面的测试

1.2 语法格式

test 测试条件

[ 测试条件 ]

注:[] 里的测试条件[]符号之间均有空格
注:如果结果是对的,也叫结果为真,用$?=0表示,反之为假,用非0表示

2. test测试命令

2.1 数值比较

参数

说明

示例

-eq

等于则为真

["$a" -eq "$b"]

-ne

不等于则为真

["$a" -ne "$b"]

-gt

大于则为真

["$a" -gt "$b"]

-ge

大于等于则为真

["$a" -ge "$b"]

-lt

小于则为真

["$a" -lt "$b"]

-le

小于等于则为真

["$a" -le "$b"]

注意:在做数值比较时,只能用整数

1)例1

比较 2是否等于1;2是否等于2

#!/bin/bash
# 通过test命令比较大小
if test 2 -eq 1; then
	echo "OK"
else
	echo "ERROR"
fi

# 通过[ 表达式 ]来比较大小,效果同test
if [ 2 -eq 2 ]; then
	echo "OK"
else
	echo "ERR"
fi

执行结果

gtest 获取测试用例名 "test"_gtest 获取测试用例名


注意:[ 表达式 ]表达式和左右两个中括号符号是有空格隔开的

2)例2

#!/bin/bash
read -p "input your num1,num2:" num1 num2
if [ $num1 -gt $num2 ]; then
	echo "$num1 大于 $num2"
elif [ $num1 -lt $num2 ]; then
	echo "$num1 小于 $num2"
else
	echo "$num1 等于 $num2"
fi

执行结果:

gtest 获取测试用例名 "test"_bash_02

2.2 字符串比较

参数

说明

示例

==

等于则为真

[ "$a" == "$b" ]

!=

不相等则为真

[ "$a" != "$b" ]

-z 字符串

字符串的长度为零则为真

[ -z "$a" ]

-n 字符串

字符串的长度不为空则为真

[ -n "$a" ]

str1 > str2

str1大于str2为真

[ str1 \> str2 ]

str1 < str2

str1小于str2为真

[ str1 \< str2 ]

1)例1

等于号 == 的测试

#!/bin/bash
read -p "input the user:" uname
if [ $uname == "root" ]; then
	echo "you are the super administrator"
elif [ $uname == "mlg" ]; then
	echo "you are general user"
else
	echo "there is no user named $uname"
fi

执行结果:

gtest 获取测试用例名 "test"_bash_03

2)例2

:在做字符串大小比较的时候,注意字符串的顺序:
  a)大于号和小于号必须转义,否则SHELL会把它当作重定向符号   b)大于和小于他们的顺序和sort排序是不一样
  c)在test比较测试中,它使用的是ASCII码,大写字母是小于小写字母的;sort排序刚好相反

#!/bin/bash
str1="test"
str2="Test"

if [ $str1 \< $str2 ]; then
	echo "$str1 < $str2"
else
	echo "$str1 > $str2"
fi

执行结果

gtest 获取测试用例名 "test"_bash_04

#!/bin/bash
str1="test"
str2="Test"

if [ $str1 \> $str2 ]; then
	echo "$str1 < $str2"
else
	echo "$str1 > $str2"
fi

执行结果

gtest 获取测试用例名 "test"_bash_05

3)ASCII码相关

参考 python的字符编码博客:

2.3 文件比较

参数

说明

示例

-e 文件名

如果文件或目录存在则为真(exist)

[ -e file ]

-r 文件名

如果文件存在且可读则为真(read)

[ -r file ]

-w 文件名

如果文件存在且可写则为真(write)

[ -w file ]

-x 文件名

如果文件存在且可执行则为真(x)

[ -x file ]

-s 文件名

如果文件存在且至少有一个字符则为真(size),即非空文件

[ -s file ]

-d 文件名

如果文件存在且为目录则为真(directory)

[ -d file ]

-f 文件名

如果文件存在且为普通文件则为真(file)

[ -f file ]

-c 文件名

如果文件存在且为字符型文件则为真(character)

[ -c file ]

-b 文件名

如果文件存在且为特殊块文件则为真(block)

[ -b file ]

file1 -nt file2

检查file1是否比file2新(new),比较时间戳

[ file1 -nt file2 ]

file1 -ot file2

检查file1是否比file2旧(old),比较时间戳

[ file1 -ot file2 ]

1)例1

判断是否存在/etc/passwd文件

#!/bin/bash
# 判断/etc/passwd文件是否存在

if [ -e /etc/passwd ]; then
	echo there is a file /etc/passwd
else
	echo no file named passwd
fi

执行结果:

gtest 获取测试用例名 "test"_文件名_06


精简版

test -e /etc/passwd && echo ok || echo error

gtest 获取测试用例名 "test"_字符串_07

2)例2

清空/var/log/messages 文件,仅保留最近一百行记录

#!/bin/bash
# 清除/var/log/message日志并保存最新100行日志

# 确定当前是root用户,否则退出并返回10
if [ $USER != "root" ]; then
	echo "非root用户,无权清除日志,退出"
	exit 10
fi
# 是否存在该文件,否则退出并返回12
if [ ! -f /var/log/messages ]; then
	echo "不存在该文件,退出"
	exit 12
fi

# 保留最近100行记录(将最近100行记录写入临时文件)
tail -100 /var/log/messages > /var/log/messages.tmp

# 清理原日志
> /var/log/messages
# cat /dev/null > /var/log/messages

# 重命名临时文件(即仅保留了最近100行记录)
mv /var/log/messages.tmp /var/log/messages

echo "清理完毕!"

执行结果:

gtest 获取测试用例名 "test"_bash_08