2020-07-23 18:21:00 星期四2020-07-23 20:52:10 星期四
test测试命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
格式:test 测试条件
如果结果是对的,也叫结果为真,用$?=0表示,反之为假,用非0表示
数值比较
运算符 | 说明 | 举例 |
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] |
例1:
[root@localhost SHELL]# vim test1.sh
# 第一种写法
!/bin/bash
if test 2 -eq 1; then
echo "yy"
else
echo "nn"
fi
# 第二种写法
if [ 2 -eq 2 ]; then
echo "ok"
else
echo "no"
fi
# 第三种写法
if ((3>1)); then
echo "yes"
else
echo "no"
fi
# 测试结果
[root@localhost SHELL]# bash test1.sh
nn
ok
yes
例2:
[root@localhost SHELL]# vim test2.sh
#!/bin/bash
read -p "请输入两个值:" var1 var2
if [ $var1 -gt $var2 ]; then
echo "$var1 > $var2"
elif [ $var1 -lt $var2 ]; then
echo "$var1 < $var2"
else
echo "$var1 = $var2"
fi
# 测试结果
[root@localhost SHELL]# bash test2.sh
请输入两个值:11 22
11 < 22
[root@localhost SHELL]# bash test2.sh
请输入两个值:22 11
22 > 11
[root@localhost SHELL]# bash test2.sh
请输入两个值:22 22
22 = 22
字符串比较
下表列出了常用的字符串运算符,假定变量 a 为 "aa",变量 b 为 "bb":
运算符 | 说明 | 举例 |
== | 两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 字符串长度是否为0,不为0返回 true。 | [ -n "$a" ] 返回 true。 |
str | 字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
str1 > str2 | str1大于str2为真 | [ str1 \> str2 ] |
str1 < str2 | str1小于str2为真 | [ str1 \< str2 ] |
在做字符串大小比较的时候,注意字符串的顺序
- 大于号和小于号必须转义,要不然SHELL会把它当成重定向符号
- 大于和小于它们的顺序和sort排序是不一样的
- 在test比较测试中,它使用的是ASCII顺序,大写字母是小于小写字母的;sort刚好相反
[root@localhost SHELL]# vim test3.sh
#!/bin/bash
read -p "请输入你的名字:" name
if [ $name == "root" ]; then
echo "你是超级管理员"
else
echo "你是普通用户"
fi
# 测试结果
[root@localhost SHELL]# bash test3.sh
请输入你的名字:root
你是超级管理员
[root@localhost SHELL]# bash test3.sh
请输入你的名字:shuai
你是普通用户
ASCII码
ASCII :((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。
var2=Test
if [ $var1 \> $var2 ]; then
echo "$var1 > $var2"
else
echo "$var1 < $var2"
fi
# 第二种写法(这种不用加转义符\)
if [[ $var1 > $var2 ]]; then
echo "$var1 > $var2"
else
echo "$var1 < $var2"
fi
文件比较
属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
[root@localhost SHELL]# vim test5.sh
#!/bin/bash
if [ -e /etc/passwd ]; then
echo "ok"
else
echo "no"
fi
[root@localhost SHELL]# bash test5.sh
ok
第二种写法
[root@localhost SHELL]# test -e /etc/passwd && echo ok || echo no
ok
例2:日志清空
[root@localhost SHELL]# vim clear-log.sh
#!/bin/bash
# clear /var/log/messages
# 确定当前是root用户
if [ $USER != "root" ]; then
echo "你必须使用root用户才能执行脚本"
exit 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
mv /var/log/mesg.tmp /var/log/messages
echo "日志已清空"
# 退出码 exit ,取值范围是0-255
[root@localhost SHELL]# bash clear-log.sh
日志已清空