shell的条件判断主要分为三大部分的内容:
条件测试类型
条件测试表达式
语句之间的逻辑关系
条件测试表达式
1、表达式的写法:
[ expression ]
[[ expression ]]
test expression
2、条件测试表达式的注意事项:
[ expression ] expression 和中括号之间是有空格,如果没有空格将会报错。
[ expression ] [[ expression ]] 作用相同,但是含义不同。
test expression 其中test是shell提供的一个命令。其返回结构是expression的逻辑结果
3、何时需要使用 [ expression ]
当bash shell的脚本中出现 类似-gt,-lt这样的整数测试符或者 -e $FILE 这样的文件测试符的时间才可以使用[],
if [ grep 'root' /etc/passwd ] 这样是错误的。
if 可以直接使用 grep 'root' /etc/passed的命令结果的。
[root@bogon sh]# cat if.sh
#!/bin/bash
if grep 'root' /etc/passwd &> /dev/null ;then
echo "there is root "
else
echo "there is no root"
fi
[root@bogon sh]# ./if.sh
there is root
从命令的执行结果可以知道:if 可以取得grep命令的执行结果。相当与执行来grep命令后的$?的值。此处,我们也需要仔细理解何时需要使用 &>/dev/null 如果我们需要命令执行的返回值,那么不许要使用 &>/dev/null ,如果我们需要命令执行结果,也就是说相当与命令执行完成后的$?值,那么,就需要使用&>/dev/null.
条件测试类型:对shell而言,常用的条件测试类型有三种:整数测试;字符串测试;文件测试
整数测试:
测试符 | 用法举例 | 含义 |
-gt | [ $A -gt $B ] | gt:great then 如果$A大于$B 结果为真,否则结果为假。 |
-lt | [ $A -lt $B ] | lt:less then 如果$A小于$B结果为真,否则为假 |
-eq | [ $A -eq $B ] | eq:equal 如果$A 等于$B 结果为真,否则结果为假 |
-ge | [ $A -ge $B ] | 如果$A大于等于$B结果为真,否则结果为假 |
-le | [ $A -le $B ] | 如果$A小于$B结果为真,否则结果为假 |
-ne | [ $A -ne $B ] | 如果$A不等于$B 结果为真,否则结果为假 |
其中整数测试需要注意的事项有:
整数测试的运算符都是双目运算符
测试符的两侧数据只能是整数。浮点数是不可以的。
测试数与中括号是有空格符的。
字符串测试:可以分别用操作符 =、 !=、< 和 > 比较字符串是否相等、不相等或者第一个字符串的排序在第二个字符串的前面或后面。单目操作符 -z 测试 null 字符串,如果字符串非空 -n 返回 True(或者根本没有操作符)。
= :[ 'abc' = 'dcf' ] # 判断=两侧的字符串是否一样 #注意区分下面的例子。
[root@localhost sh]# [ 'abc' = 'dcf' ];echo $?
1
[root@localhost sh]# [ 'abc'='dcf' ];echo $?
0
!= [ 'abc' != 'dcf' ] #判断两个字符串是否不等,不等为真,否则未见
[root@localhost sh]# [ 'abc' != 'dcf' ];echo $?
0
< [ 'abc' \< 'bcd' ] # 判断后面的字符串是否在前面的字符串的前面
[root@bogon testdir]# [ 'abc' \< 'bcd' ] ; echo $?
0
> 同理,判断前面的字符串排序是否在后面字符串的前面
字符串测试单目操作符: -z ,-n
[root@bogon testdir]# [ -n 'abc' ];echo $?
0
[root@bogon testdir]# [ -n '' ];echo $?
1
[ -n $STRING ] 如果$STRING 是空,则返回为真,否则返回为假。
[root@bogon testdir]# [ -z 'abc' ]; echo $?
1
[root@bogon testdir]# [ -z ' ' ];echo $?
1
[root@bogon testdir]# [ -z ];echo $?
0
[root@bogon testdir]# [ -z $STRING ] ;echo $?
0
[ -z $STRING ] 如果$STRING 为NULL,或者根本没有定义,返回为真,否则返回为假。
小结:
字符串测试符号,中有单目运算符 [ -n $STRING ] [ -z $STRING ] 也有双目运算符,= ;!=;
<; > 需要注意的-z -n的区别,和<,>需要使用转义字符\
文件测试:
测试符 |
用法举例 |
含义 |
-f |
[ -f $FILE ] |
如果$FILE是普通文件,返回真,否则返回假 |
-d |
[ -d $FILE ] |
如果$FILE是目录,返回真,否则返回假 |
-r |
[ -r $FILE ] |
如果$FILE 是可读的,返回真,否则返回假 |
-w |
[ -w $FILE ] |
如果$FILE 是可写的,返回真,否则返回假 |
-x |
[ -x $FILE ] |
如果$FILE 是可执行的,返回真,否则返回假 |
-s |
[ -s $FILE ] |
如果$FILE是非空的,返回真,否则返回假 |
-e |
[ -e $FILE ] |
如果$FILE 是存在的,返回真,否则返回假 |
注意:
$FILE,需要路径,也就是脚本能找到的路径。
语句间的逻辑关系:
&&:逻辑与
|| ; 逻辑或
command1 && command2;
如果com1 返回值是假,那么com2不会执行
如果com1 返回只是真,那么com2一定要执行,二者执行的结果决定com1 && com2的返回结果
com1 || com2
如果com1 执行结果为真,那么com2不会执行,
如果com1执行结果为假,那么com2一定要执行,二者执行的结果决定com1 || com2的返回的结果
以上就是短路逻辑的实例。
条件测试是shell脚本的基础,涉及的内容包括,测试表达式的写法,条件测试的分类,各种测试符的使用。也包括语句之间的逻辑关系。需要特别理解短路逻辑的含义。