在shell编程中,if语句本身不执行任何判断,它实际上接受一个程序作为参数,然后执行这个程序,并依据这个程序的返回值来判断是否执行相应的语句。
程序的返回值是0,则为真,反之则为假。
目录
·test命令(用于判断表达式的真假)
和test相同作用的方括号[ 也可以进行条件测试
·test和[命令可以对三类表达式进行测试
1、字符串比较
2、文件测试
3、数字比较
·复合表达式(!、-a、-o)
·test命令(用于判断表达式的真假)
语法:
test expr
例子:
用test命令判断字符串变量password是否等于“123456”
test "password" = "123456"
如果两者相等,test命令就返回值0,反之则返回1.
和test相同作用的方括号[ 也可以进行条件测试
语法:
[ expr ] #符号两边的空格不可以省略
示例:
[ "password" = "123456" ]
所以 test "password" = "123456" 等同于 [ "password" = "123456" ]
注:空格在shell这个命令解释器中用于分隔命令和传递给它的参数,或者用于分隔命令的两个参数
·test和[命令可以对三类表达式进行测试
1、字符串比较
-z str | 当字符串str长度为0时,返回真 |
-n str | 当字符串str长度大于0时,返回真 |
str1 = str2 | 当字符串str1长度和字符串str2长度相等时,返回真 |
str1 != str2 | 当字符串str1长度和字符串str2长度不相等时,返回真 |
注:shell对大小写敏感
2、文件测试
-x pathname | 当pathname指定的文件或目录设置了可执行权限时,返回真 |
-w pathname | 当pathname指定的文件或目录设置了可写权限时,返回真 |
-r pathname | 当pathname指定的文件或目录设置了可读权限时,返回真 |
-e pathname | 当pathname指定的文件或目录设置了存在时,返回真 |
-o pathname | 当pathname指定的文件或目录被当前进程拥有时,返回真 |
-d pathname | 当pathname是一个目录时,返回真 |
-s file | 当file存在且大小为0时,返回真 |
-f file | 当file是常规文件时,返回真;(不包括符号链接、目录、管道等) |
-b file | 当file是块设备文件时,返回真 |
-c file | 当file是字符文件时,返回真 |
-h file | 当file是符号链接时,返回真 |
-p file | 当file是管道时,返回真 |
示例:
#! /bin/bashif [ -x /home/fengyun/test.sh ]
thenecho "the test.sh can be execute"
fi
3、数字比较
test和[命令在数字比方面只能用来比较整数(包括负整数和整数)
语法:
test int1 option int2#或者[ int1 option int2 ]
-eq(全拼:equal) | 相等为真 |
-ne(全拼:not equal) | 不相等为真 |
-lt(全拼:lower than) | 如果int1 小于 int2,则为真 |
-gt(全拼:greater than) | 如果int1 大于 int2,则为真 |
-le(全拼:lower or equal) | 如果int1 小于或等于 int2,则为真 |
-ge(全拼:greater or equal) | 如果int1 大于或等于 int2,则为真 |
·复合表达式(!、-a、-o)
!expr | 非运算,当expr为假时返回真 |
expr1 -a expr2 | 与运算,同为真才返回真 |
expr1 -o expr2 | 或运算,有一个为真则返回真 |
示例:如果用户输入的参数对应的文件存在,且/usr/bin/vi文件可执行,则执行相应的语句
#! /bin/bashif [ -f $@ -a -x /usr/bin/vi ]
then cp $@ $@.bakvi $@
fi
补充:shell的条件操作“&&”和“||”可以用来代替test和[命令中的-a和-o;
上面的示例可以写成
#! /bin/bashif [ -f $@ ] && [ -x /usr/bin/vi ]
then cp $@ $@.bakvi $@
fi
注:“&&”或者“||”连接的是两条[(或者test)命令,而-a、-o操作符是在同一条[( 或者test)命令中使用的