这里文章名虽为条件测试详解,但实质上是 linux shell 条件测试(https://blog.csdn.net/zhang_referee/article/details/83714064) 的案例补充。
文章主要内容如下:
- 字符串测试
- 整数测试
字符串测试
如果你看过上篇文章--linux shell 条件测试(https://blog.csdn.net/zhang_referee/article/details/83714064)的话,会发现下面这个表也存在于上篇文章,这里再次单独列出来,方便阅读。
常用字符串测试操作符 | 说明 |
---|---|
-z "字符串" | 若长度为0 则真,-z 可以理解为zero |
-n 字符串" | 若长度不为0则真,-n 可以理解为no zero |
"串1" = "串2" | 若串1 等于串2则真,可使用"==" 代替 "=" |
"串1" != "串2" | 若串1不等于串2则真 |
zhang@zhang:~$ echo $file $file1
zhang@zhang:~$ [ -n "$file" ] && echo 1 || echo 0
0
zhang@zhang:~$ [ -z "$file" ] && echo 1 || echo 0
1
zhang@zhang:~$ [ -n $file ] && echo 1 || echo 0
-n 指字符串长度不为0 则真,当我们去掉变量的""(双引号)后,可以发现虽然没有出错,但执行结果已然不正确。
这里提一下,在进行字符串操作的时候,建议要加上双引号。
zhang@zhang:~/Code/Shell$ echo "the variable file1 is $file1" ; echo "the variable file2 is $file2"
the variable file1 is
the variable file2 is test.sh
zhang@zhang:~/Code/Shell$ [ -n "$file1" -a -n "$file2" ] && echo 1 || echo 0
0
zhang@zhang:~/Code/Shell$ [ -z "$file1" -a -n "$file2" ] && echo 1 || echo 0
1
zhang@zhang:~/Code/Shell$ [[ -z "$file1" && -n "$file2" ]] && echo 1 || echo 0
1
zhang@zhang:~/Code/Shell$
zhang@zhang:~/Code/Shell$ echo $file
zhang@zhang:~/Code/Shell$ echo $file1
zhang@zhang:~/Code/Shell$ [ "$file1" = "$file" ] && echo 1 || echo 0
1
zhang@zhang:~/Code/Shell$ [ "$file1" != "$file" ] && echo 1 || echo 0
0
zhang@zhang:~/Code/Shell$
整数测试
在[] 中使用的比较符 | 在(()) 和 [[]] 中使用的比较符 | 说明 |
---|---|---|
-eq | == | equal 的缩写,相等 |
-ne | != | not equal 的缩写,不相等 |
-gt | > | 大于greater than |
-ge | >= | 大于等于greater than |
-lt | < | 小于less than |
-le | <= | 小于等于less equal |
zhang@zhang:~/Code/Shell$ int1=14;int2=25
zhang@zhang:~/Code/Shell$ echo $int1; echo $int2
14
25
zhang@zhang:~/Code/Shell$ [ $int1 -eq $int2 ] && echo 1 || echo 0
0
zhang@zhang:~/Code/Shell$ [ $int1 -lt $int2 ] && echo 1 || echo 0
1
zhang@zhang:~/Code/Shell$ [ $int -ge $int2 ] && echo 1 || echo 0
bash: [: -ge: 需要一元表达式
0
zhang@zhang:~/Code/Shell$ [ $int1 -ge $int2 ] && echo 1 || echo 0
0
zhang@zhang:~/Code/Shell$ [ $int1 -le $int2 ] && echo 1 || echo 0
1
zhang@zhang:~/Code/Shell$
直接通过数学运算符比较
zhang@zhang:~$ int1=14;int2=25
zhang@zhang:~$ echo $int1;echo $int2
14
25
zhang@zhang:~$ [ $int1 > $int2 ] && echo 1 || echo 0
1
zhang@zhang:~$ [ $int1 \> $int2 ] && echo 1 || echo 0
0
zhang@zhang:~$ [ $int1 < $int2 ] && echo 1 || echo 0
1
zhang@zhang:~$ [ $int1 \< $int2 ] && echo 1 || echo 0
1
zhang@zhang:~$ (( $int1 > $int2 )) && echo 1 || echo 0
0
zhang@zhang:~$ [ $int1 = $int2 ] && echo 1 || echo 0
0
zhang@zhang:~$ [ $int1 == $int2 ] && echo 1 || echo 0
0
zhang@zhang:~$ [ $int1 != $int2 ] && echo 1 || echo 0
1
zhang@zhang:~$
PS:在[] 语法中使用 > (d大于号) ,< (小于号)要进行转义 。
也可以使用test 语法:
zhang@zhang:~$ test $int1 > $int2 && echo 1 || echo 0
1
zhang@zhang:~$ test $int1 \> $int2 && echo 1 || echo 0
0
zhang@zhang:~$ test $int1 == $int2 && echo 1 || echo 0
0
zhang@zhang:~$ test $int1 < $int2 && echo 1 || echo 0
1
zhang@zhang:~$ test $int1 \< $int2 && echo 1 || echo 0
1
zhang@zhang:~$ echo $int1;echo $int2
14
25
zhang@zhang:~$
可以看到在test 语法中,同样也是需要对< 、> 进行转义的。