1. test命令初识
1.1 定义
shell中的test命令用于检查某个条件是否成立,它可以进行数值
、字符
和文件
三个方面的测试
1.2 语法格式
test 测试条件
或
[ 测试条件 ]
注:[] 里的测试条件
与[
和]
符号之间均有空格
注:如果结果是对的,也叫结果为真,用$?=0
表示,反之为假,用非0
表示
2. test测试命令
2.1 数值比较
参数 | 说明 | 示例 |
-eq | 等于则为真 |
|
-ne | 不等于则为真 |
|
-gt | 大于则为真 |
|
-ge | 大于等于则为真 |
|
-lt | 小于则为真 |
|
-le | 小于等于则为真 |
|
注意:在做数值比较时,只能用整数
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
执行结果
注意:[ 表达式 ]
表达式和左右两个中括号符号是有空格隔开的
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
执行结果:
2.2 字符串比较
参数 | 说明 | 示例 |
== | 等于则为真 |
|
!= | 不相等则为真 |
|
-z 字符串 | 字符串的长度为零则为真 |
|
-n 字符串 | 字符串的长度不为空则为真 |
|
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
执行结果:
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
执行结果
#!/bin/bash
str1="test"
str2="Test"
if [ $str1 \> $str2 ]; then
echo "$str1 < $str2"
else
echo "$str1 > $str2"
fi
执行结果
3)ASCII码相关
参考 python的字符编码博客:
2.3 文件比较
参数 | 说明 | 示例 |
-e 文件名 | 如果文件或目录存在则为真(exist) |
|
-r 文件名 | 如果文件存在且可读则为真(read) |
|
-w 文件名 | 如果文件存在且可写则为真(write) |
|
-x 文件名 | 如果文件存在且可执行则为真(x) |
|
-s 文件名 | 如果文件存在且至少有一个字符则为真(size),即非空文件 |
|
-d 文件名 | 如果文件存在且为目录则为真(directory) |
|
-f 文件名 | 如果文件存在且为普通文件则为真(file) |
|
-c 文件名 | 如果文件存在且为字符型文件则为真(character) |
|
-b 文件名 | 如果文件存在且为特殊块文件则为真(block) |
|
file1 -nt file2 | 检查file1是否比file2新(new),比较时间戳 |
|
file1 -ot file2 | 检查file1是否比file2旧(old),比较时间戳 |
|
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
执行结果:
精简版
test -e /etc/passwd && echo ok || echo error
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 "清理完毕!"
执行结果: