概述
test
命令是 shell 环境中测试条件表达式的实用工具。
注:但实际上在 shell 编程中并未使用
test
命令,而通常使用[ ]
简写形式进行替代。
语法
该命令的语法如下:
test 条件表达式
test
命令会根据条件表达式的结果返回真(0)或者返回假(1)。该命令常用于判断四类情况:
- 表达式判断
- 字符串比较
- 数字比较
- 文件比较
使用
表达式判断
表达式判断的基本语法如下:
# 表达式为真
if test 表达式
# 表达式为假
if test ! 表达式
# 两个表达式都为真才为真,使用 -a 选项连接(and)
test 表达式1 -a 表达式2
# 两个表达式有一个为真就为真,使用 -o 选项连接(or)
test 表达式1 -o 表达式2
# 条件求反
test 表达式1 ! 表达式2
示例如下:
判断字符串
字符串判断的基本语法如下:
# 字符串的长度是否不等于零
test -n 字符串
# 字符串的长度是否等于零
test -z 字符串
# 字符串是否相等
test 字符串1 = 字符串2
# 字符串是否不相等(注意空格)
test 字符串1 != 字符串2
示例如下:
判断整数
可以对两个整数的大小进行判断,基本语法如下:
# 判断两个整数是否相等
test 整数1 -eq 整数2
# 判断整数1是否大于等于整数2
test 整数1 -ge 整数2
# 判断整数1是否大于整数2
test 整数1 -gt 整数2
# 判断整数1是否小于等于整数2
test 整数1 -le 整数2
# 判断整数1是否小于整数2
test 整数1 -lt 整数2
# 判断整数1是否不等于整数2
test 整数1 -ne 整数2
示例如下:
判断文件
还有些对于文件判断的选项:
# 两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode。
test File1 –ef File2
# 判断文件1是否比文件2新
test File1 –nt File2
# 判断文件1比是否文件2旧
test File1 –ot File2
# 文件是否块设备文件
test –b File
# 文件并且是字符设备文件
test –c File
# 文件并且是目录
test –d File
# 文件是否存在 (常用)
test –e File
#文件是否为正规文件 (常用)
test –f File
# 文件是否是设置了组id
test –g File
# 文件属于的有效组ID
test –G File
# 文件是否是一个符号链接(同-L)
test –h File
# 文件是否设置了Sticky bit位
test –k File
# 文件存在并且是块设备文件
test –b File
# 文件是否是一个符号链接(同-h)
test –L File
# 文件的属于有效用户ID
test –o File
# 文件是一个命名管道
test –p File
# 文件是否可读
test –r File
# 文件是否是非空白文件
test –s File
# 文件描述符是在一个终端打开的
test –t FD
# 文件存在并且设置了它的set-user-id位
test –u File
# 文件是否存在并可写
test –w File
# 文件属否存在并可执行
test –x File
示例如下:
Shell 中使用 test
在 shell 脚本中并不是直接使用 test
命令的,而是使用中括号 [ ]
。语法如下:
test 条件表达式
# 等价于,注意条件表达式左右两侧都必须要有空格
[ 条件表达式 ]
例如:
# 注意空格
test a == b
# 等价于
[ a == b ]
完整的 shell 脚本示例如下:
#! /bin/bash
read -p "请输入第一个数:" a
read -p "请输入第二个数:" b
echo "使用 test 语法比较:"
if test $a -gt $b; then
echo "a>b"
elif test $a -lt $b; then
echo "a<b"
else
echo "a=b"
fi
echo "使用 [ ] 语法比较:"
if [ $a -gt $b ]; then
echo "a>b"
elif [ $a -lt $b ]; then
echo "a<b"
else
echo "a=b"
fi
注:空格是必须的,不能省略,否则将会报错。