shell 中的 test 命令
学习test命令之前,首先我们看if - then语句类型
if command
then
commands
fi
或者
if command; then
commandds
fi
原理:
bash shell的if语句会允许if行定义的那个命令。
如果该命令的退出状态码(0-255)是0(表示该命令成功运行),位于then后面的命令就会被执行。
如果该命令退出状态码是非0值,那then部分的命令就不会被执行。bash shell会执行脚本中的下一个命令。
在then部分,可以用多个命令。bash shell会将这部分命令当成一个块。只有在if语句行那个命令返回退出状态码状态码为0时执行这块命令,在if语句行命令返回非0值状态码时跳过这块命令。
test命令格式:
test condition
conditon是test命令要测试的一系列参数和值。当在if -then语句中时,test命令看起来是这样的:
if test conditon
then
commands
fi
bash shell提供了另外一种在if-then中声明test命令的方法:
if [ condition]
then
commands
fi
即用方括号[ ]定义了test命令用到的条件。
但是必须注意:必须在[]方括号左括号右侧和右括号左侧各加一个空格,否则会报错。
[ ]方括号形式的test命令可以判断3类条件:
1、数值比较;
2、字符串比较
3、文件比较
数值比较:注意,[ ] 数值比较用英文字母缩写
n1 -eq n2 #检查n1是否等于n2,eq是equals缩写,相当于数学符号=
n1 -ge n2 #检查n1是否大于或等于n2相等,ge是greater or equals缩写,相当于数学符号>=
n1 -gt n2 #检查n1是否大于n2,gt是greater than缩写,相当于数学符号>
n1 -le n2 #检查n1是否小于或等于,le是less or equals缩写,相当于数学符号<=
n1 -lt n2 #检查n1是否小于n2,lt是less than缩写,相当于数学符号<
n1 -ne n2 #检查n1是否不等于n2,ne是not equals缩写,相当于数学符号!=
数值条件的测试可以用在数字和变量上:
eg:
VAL1=10
VAL2=11
if [ $VAL -gt 5 ]
then
echo "The test value $VAL1 is greater than 5"
fi
注意:test [ ] 命令无法处理变量中存储的浮点值。bash shell能处理的数仅有整数。
if-then的高级特性
形式:
if (( expression )) ; then 双尖括号(( ))用于数学表达式。expression:表达式的意思。
[ ] test命令(即方括号)只允许你在比较中进行简答的算数操作。
双尖括号(( expression ))中expression除了支持标准的数学运算符,还可以是任何数据赋值或比较表达式,
双尖括号命令中会用到的其他运算符:
val++ 后增
val-- 后减
++val 先增
--val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 位布尔 与
| 位布尔 或
&& 逻辑和
|| 逻辑或
eg:
cat test
#!/bin/sh
val=10
if (( val**2 > 90 )) ##双星号,球迷运算
then
(( val2 = val1 ** 2 ))
echo "The square of $val1 is $val2"
fi
说明:使用双尖括号不需要对表达式中的数学符号进行转义,比如上例中>号。
字符串比较
str1 = str2 #检查str1是否和str2相同
str1 != str2 #检查str1是否和str2不同
str1 > str2 #检查str1是否比str2大
str1 < str2 #检查str1是否比str2小
-n str1 #检查str1的长度是否非0
-z str1 #检查str1的长度是否为0
test命令比较字符串需要注意事项:
1、test的比较会 将所有的标点和大写也考虑在内。
2、>、<大于小于号必须转义,否则shell会认为是重定向符号
eg:
var1=baseball
var2=hockey
if [ $var1 \> $var2 ]
3、大于小于顺序和sort命令所采用的不同,即sort命令处理大写字母的方法刚好跟test命令相反。
在test[ ] 命令中,大写字母会被当成小于小写字母的。
test命令使用标准的ASCII顺序,根据每个字符的ASCII数值来决定排序
sort命令使用本地化语言设置中定义的排序顺序。
4、用-n or -z参数判断变量长度是否为非0 或者判断长度为0时,未在shell中定义的变量的长度仍然为0.
if-then的高级特性
if [[ ]]; then 双方括号提供了针对字符串比较的高级特性
[[ expression ]] 双方括号里的expression使用了test命令中采用的标准字符串进行比较。
但是他提供了另一个特性-模式匹配(pattern matching),在末世匹配中可以定义一个正则表达式来匹配字符串值:
eg:
if [[ $USER == te* ]]
then
echo "Hello"
else
echo "Sorry"
文件比较
-d file 检查file是否存在并是一个目录,d是directory的首字母
-e file 检查file是否存在,e是exit的首字母
-f file 检查file是否存在并是一个文件,f是file的首字母
-r file 检查file是否存在并可读,r是read的首字母
-s file 检查file是否存在并非空,
-w file 检查file是否存在并可写,w是write的首字母
-x file 检查file是否存在并可执行,
-O file 检查file是否存在并属当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新,nt new than
file1 -ot tile2 检查file2是否比file2旧,ot old than
复合条件测试
if-then 可允许你使用布尔逻辑来组合测试。
形式;
[ condition1 ] && [ conditon2 ] and 即与运算,两个条件都必须满足才执行then后面的语句。
[ conditon1 ] || [ conditon2 ] or 即或运算,两个条件有一个满足就可执行then后面的语句。