<Linux>Shell中的条件测试

条件测试介绍

(1)条件测试可以用于判断某个特定条件是否满足

(2)条件测试的种类

  • 命令成功或失败
  • 表达式为真或假

(3)条件测试的值

由于Bash中没有布尔类型变量,因此通过退出状态来判断。

  • 退出状态为0表示命令成功或表达式为

  • 退出状态为非0表示命令失败或表达式为

可以通过命令$?来查看退出状态的值

(4)条件测试语句

语句

(1)格式1: test <测试表达式>

(2)格式2:[ <测试表达式> ],注意表达式两端有空格

(3)格式3: [[ <测试表达式> ]](bash 2.x版本以上使用),同样注意表达式两端有空格

说明

1)格式1与格式2是等价的,格式3是扩展的test命令

2)在[[]]中可以使用通配符进行模式匹配

3)&&,||,<,>能够正常存在于[[]]中,但是不能在[]中出现

4)在[,[[之后紧接的字符必须是空格,]]]之前的字符也必须为空格

5)要对整数进行关系运算也可以使用(())进行测试

(5)条件测试操作符

条件测试操作符就是条件测试表达式中可用的操作符

1)文件测试操作符

2)字符串测试操作符

3)整数二元比较操作符

4)使用逻辑运算符


1、文件测试

文件测试,用于测试文件是否存在,文件属性,访问权限等

测试表达式 作用
[ -f fname ] fname存在并且是普通文件时,返回真(即返回0)
[ -L fname ] fname存在并且是链接文件时,返回真
[ -d fname ] fname存在并且是一个目录时,返回真
[ -e fname ] fname(文件或目录)存在时,返回真
[-s fname ] fname存在并且大小大于0时,返回真
[ -r fname ] fname(文件或目录)存在并且可读时,返回真
[ -w fname ] fname(文件或目录)存在并且可写时,返回真
[ -x fname ] fname(文件或目录)存在并且可执行时,返回真

例子

<Linux>Shell中的条件测试
<Linux>Shell中的条件测试

其中,exper0529是目录文件,p1.py是普通文件


2、字符串测试

测试表达式 作用
[ -z string ] 如果字符串string长度为0,返回真
[ -n string ] 如果字符串string长度不为0,返回真
[ str1 = str2 ] 两字符串相等(也可使用==)返回真
[ str1 != str2 ] 两字符串不相等返回真
[[ str1 = str2 ]] 两字符串相同返回真
[[ str1 != str2 ]] 两字符串不相同返回真
[[ str1 =~ srt2 ]] str2是str1的子串返回真
[[ str1 > srt2 ]] str1大于str2返回真
[[ str1 < srt2 ]] str1小于str2返回真

字符串从左到右将对应字符的ASCII码进行比较

#!bin/bash

str1="hello world"
str2="hello linux"
str3="hello world"

#测试字符串大小是否为0
[ -z str1 ]  #1
echo $?
[ -n str1 ] #0
echo $?

#测试[]的字符串相等与[[]]的字符串相等的区别
[ str1 = str2 ] #1
echo $?
[ str1 = str3 ]  #1
echo $?

[ "$str1" = "$str2" ]  #1
echo $?
[ "$str1" = "$str3" ]   #0
echo $?

[[ str1 = str2 ]]   #1
echo $?
[[ str1=str3 ]]  #0
echo $?

运行结果

<Linux>Shell中的条件测试

由此看出,比较字符串是否相等时,使用[ str1 = str2 ],则这两个必须是指向同一个字符串;使用[[ str1 = str2 ]],则这两个字符串相等即为真

检查空值

(1)[ "$str" = "" ]
(2)[ -z "$str" ]
(3)[ ! "$str"]

检查非空值

(1)[ "$str" != "" ]
(2)[ -n "$str" ]
(3)[ "$str"]

3、整数二元比较

测试表达式 作用
[ int1 -eq int2 ] int1等于int2则返回真
[ int1 -ne int2 ] int1不等于int2则返回真
[ int1 -gt int2 ] int1大于int2则返回真
[ int1 -ge int2 ] int1大于等于int2则返回真
[ int1 - lt int2 ] int1小于int2则返回真
[ int1 -le int2 ] int1小于等于int2则返回真

[[]]可直接替换[],如[ $int1 -eq $int2 ]等价于[[ $int1 -eq $int2 ]],但是在[[]]
中的整数也可以不加$符号

测试表达式 作用
[ int1 == int2 ] int1等于int2则返回真
[ int1 != int2 ] int1不等于int2则返回真
[ int1 > int2 ] int1大于int2则返回真
[ int1 >= int2 ] int1大于等于int2则返回真
[ int1 < int2 ] int1小于int2则返回真
[ int1 <= int2 ] int1小于等于int2则返回真

这里操作符两边的空格可以省略

#!bin/bash

int1=10
int2=20
int3=10
int4=40

(( int1 > int2 ))
echo $?     #1
(( int1>= int3 ))
echo $?    #0

(( int2 < int4 ))
echo $?    #0
(( int2 != int3 ))
echo $?  #0


[ $int1 -gt $int2 ]
echo $?   #1
[ $int1 -ge $int3 ]
echo $?    #0
[ $int2 -lt $int4 ]
echo $?    #0
[ $int2 -ne $int3 ]
echo $? #0


[[ $int1 -gt $int2 ]]
echo $?   #1
[[ $int1 -ge $int3 ]]
echo $?    #0
[[ int2 -lt int4 ]]
echo $?    #0
[[ int2 -ne int3 ]]
echo $? #0

运行结果
<Linux>Shell中的条件测试

4、逻辑运算

测试表达式 作用
[ expr1 -a expr2 ] 逻辑与,都为真才返回真
[ expr1 -o expr2 ] 逻辑或,有一个为真就返回真
[ ! expr ] 逻辑非
测试表达式 作用
[[ expr1 -a expr2 ]] 逻辑与,都为真才返回真
[[ expr1 -o expr2 ]] 逻辑或,有一个为真就返回真
[[ ! expr ]] 逻辑非
测试表达式 作用
(( expr1 && expr2 )) 逻辑与,都为真才返回真
(( expr1
(( ! expr )) 逻辑非
!bin/bash

int1=1
int2=2
int3=3
int4=1

[ $int1 -lt $int2  -a $int2 -lt $int4 ]
echo $?         #1

[ $int1 -lt $int2  -o $int2 -lt $int4 ]
echo $?         #0

[ ! $int2 -lt $int4 ]
echo $?         #0

运行结果

<Linux>Shell中的条件测试

上一篇:洛谷 P1020 导弹拦截


下一篇:导弹拦截p1020(LIS问题)