test测试命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
格式:test 测试条件
如果结果是对的,也叫结果为真,用$?=0表示,反之为假,用非0表示
数值比较
参数 |
说明 |
示例 |
-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:比较大小
[root@xuegod63 ~]# cat test1.sh
#!/bin/bash if test 2 -eq 1 ; then echo ok else echo err fi if [ 2 -eq 2 ] ; then echo ok else echo err fi
例2: 比较整数大小
[root@xuegod63 ~]# cat test2.sh
#!/bin/bash read -p "input var1 var2:" var1 var2 if [ $var1 -gt $var2 ] ; then echo "$var1 > $var2" elif [ $var1 -lt $var2 ] ; then echo "$var1 < $var2" else echo "$var1 = $var2" fi
注意:在做数值比较时,只能用整数
字符串比较
参数. |
说明 |
示例 |
== |
等于则为真 |
[ “$a” == “$b” ] |
!= |
不相等则为真 |
[ “$a” != “$b” ] |
-z 字符串. |
字符串的长度为零则为真 |
[ -z “$a” ] |
-n 字符串 |
字符串的长度不为空则为真 |
[ -n “$a” ] |
str1 > str2 |
str1大于str2为真 |
[ str1 \> str2 ] |
str1 < str2 |
str1小于str2为真 |
[ str1 \< str2 ] |
例1:根据用户名判断是否是超级管理员
[root@xuegod63 ~]# cat test3.sh
#!/bin/bash read -p "input your name: " name if [ $name == "root" ] ; then echo "you are super administrator" else echo "You are a general user" fi
[root@xuegod63 ~]# bash test3.sh
input your name: root
you are super administrator
[root@xuegod63 ~]# bash test3.sh
input your name: mk
You are a general usero "You are a general user"
例2:在做字符串大小比较的时候,注意字符串的顺序
-
大于号和小于号必须转义,要不然SHELL会把它当成重定向符号
-
大于和小于它们的顺序和sort排序是不一样的
-
在test比较测试中,它使用的是ASCII顺序,大写字母是小于小写字母的;sort刚好相反
扩展: ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646。
[root@xuegod63 ~]# cat test4.sh
#!/bin/bash var1=test var2=Test if [ $var1 \> $var2 ] ; then echo "$var1 > $var2" else echo "$var1 < $var2" fi
[root@xuegod63 ~]# bash test4.sh
test > Test
文件比较
参数 |
.说明 |
示例 |
-e 文件名. |
如果文件或目录存在则为真 |
[ -e file ] |
-r 文件名. |
如果文件存在且可读则为真 |
[ -r file ] |
-w 文件名. |
如果文件存在且可写则为真 |
[ -w file ] |
-x 文件名. |
如果文件存在且可执行则为真 |
[ -x file ] |
-s 文件名 |
如果文件存在且至少有一个字符则为真 |
[ -s file ] |
-d 文件名. |
如果文件存在且为目录则为真 |
[ -d file ] |
-f 文件名. |
如果文件存在且为普通文件则为真 |
[ -f file ] |
-c 文件名. |
如果文件存在且为字符型文件则为真 |
[ -c file ] |
-b 文件名.. |
如果文件存在且为块特殊文件则为真 |
[ -b file ] |
file1 -nt fle2 |
检查file1是否比file2新 |
[ file1 -nt file2 ] |
file1 -ot file2 |
检查file1是否比file2旧 |
[ file1 -ot file2 ] |
例1:
[root@xuegod63 ~]# vim test5.sh
#!/bin/bash if [ -e /etc/passwd ] ; then echo ok else echo err fi
[root@xuegod63 ~]# bash test5.sh
ok
例2:
[root@xuegod63 ~]# test -e /etc/aaa.txt && echo ok || echo err
err
[root@xuegod63 ~]# test -e /etc/passwd && echo ok || echo err
ok
[root@xuegod63 ~]# test -e /etc && echo ok || echo err
ok
例:清空日志目录
[root@xuegod63 ~]# cat clear-log.sh
#!/bin/bash # clear /var/log/messages #确定当前是root用户 if [ $USER != "root" ];then echo "你必须使用root用户才能执行脚本" exit 10 #直接退出,并返回10 fi #判断文件是否存在 if [ ! -f /var/log/messages ];then echo "文件不存在" exit 12 fi #保留最近100行的日志内容 tail -100 /var/log/messages > /var/log/mesg.tmp #日志清理 >/var/log/messages #cat /dev/null > /var/log/messages mv /var/log/mesg.tmp /var/log/messages echo "Logs clean up"
注:退出码 exit ,取值范围是0-255
例: exit 退出bash,并返回一个值
[root@xuegod63 ~]# ssh 192.168.1.63
[email protected]'s password: 123456
Last login: Mon May 28 20:37:41 2018 from xuegod63.cn
[root@xuegod63 ~]#
[root@xuegod63 ~]# exit 10
登出
Connection to 192.168.1.63 closed.
[root@xuegod63 ~]# echo $?
10