test命令
1、定义
test
是Shell
内置命令,用来检测某个条件是否成立。test
通常和if
语句一起使用,并且大部分if
语句都依赖test
。- 进行数值、字符串和文件三个方面的检测
test 命令的用法为:
test expression
//当 test 判断 expression 成立时,退出状态为 0,否则为非 0 值。
或者
[ expression ]
//注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。[]的写法更加简洁,比 test 使用频率高。
2、test 文件检测
实例:
1、在 Shell 脚本文件所在的目录新建一个文本文件并命名为 log.txt
2、新建脚本test.sh
#!/bin/bash
read filename
read log
if test -w $filename && test -n $url
then
echo $log > $filename
echo "input sucessful"
else
echo "false"
fi
3、运行 Shell 脚本,运行结果为:
3、test数值比较
#!/bin/bash
read a b
if test $a -eq $b
then
echo "两个数相等"
else
echo "两个数不相等"
fi
运行结果1:
10 10
两个数相等
-le
选项表示小于等于,-ge
选项表示大于等于,-eq表示等于
4、test字符串判断
==、>、<
在大部分编程语言中都用来比较数字,而在 Shell 中,它们只能用来比较字符串- 不管是比较数字还是字符串,Shell 都不支持
>=
和<=
运算符
#!/bin/bash
read str1
read str2
#检测字符串是否为空
if [ -z "$str1" ] || [ -z "$str2" ]
then
echo "字符串不能为空"
exit 0
fi
#比较字符串
if [ $str1 = $str2 ]
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi
运行结果:
hello KOBE
hi GIGI
两个字符串不相等
$str1
和 $str2
都被双引号包围起来,这样做是为了防止 $str1
或者 $str2
是空字符串
时出现错误
4.1、变量建议用双引号
包围起来
test
和 []
都是命令,一个命令本质上对应一个程序或者一个函数。即使是一个程序,它也有入口函数,例如C语言程序的入口函数是 main(),运行C语言程序就从 main() 函数开始,所以也可以将一个程序等效为一个函数,这样我们就不用再区分函数和程序了,直接将一个命令和一个函数对应起来即可.
命令的本质:使用一个命令其实就是调用一个函数,命令后面附带的选项和参数最终都会作为实参传递给函数。
假设 test
命令对应的函数是 func()
,使用test -z $str1
命令时,会先将变量 $str1
替换成字符串:
- 如果
$str1
是一个正常的字符串,比如abc123
,那么替换后的效果就是test -z abc123
,调用func()
函数的形式就是func("-z abc123")
。test
命令后面附带的所有选项和参数会被看成一个整体,并作为实参传递进函数。 - 如果
$str1
是一个空字符串,那么替换后的效果就是test -z
,调用func()
函数的形式就是func("-z")
,这就比较奇怪了,因为-z
选项没有和参数成对出现,func()
在分析时就会出错。
如果我们给 $str1
变量加上双引号,当 $str1
是空字符串时,test -z "$str1"
就会被替换为test -z ""
,调用 func()
函数的形式就是func("-z \"\"")
,很显然,-z
选项后面跟的是一个空字符串(\"
表示转义字符),这样 func()
在分析时就不会出错了。
5、test逻辑运算
#!/bin/bash
read str1
read str2
#检测字符串是否为空
if [ -z "$str1" -o -z "$str2" ] #使用 -o 选项取代之前的 ||
then
echo "字符串不能为空"
exit 0
fi
#比较字符串
if [ $str1 = $str2 ]
then
echo "两个字符串相等"
else
echo "两个字符串不相等"
fi