主要内容:
条件测试(字符串比较、整数比较、文件状态)、IF选择结构(单分支、双分支、多分支)、For循环结构、While循环结构
一、表达式比较评估
test 命令是 Unix 和 Linux 系统中用于评估条件表达式的命令。它通常用于 shell 脚本中,以根据条件执行不同的操作。test 命令可以检查文件类型、比较字符串和整数,以及执行逻辑操作。
可以为Shell脚本实现智能化判断的结果,为命令的执行提供最直接的识别依据;针对文件或目录的读/写等状态、数值的大小、字符串是否匹配、多条件组合;
- 格式:test expression
- 格式:[ expression ]
或者使用方括号
[ ]
(注意方括号与表达式之间要有空格)
注意:条件测试操作本身不显示出任何信息。测试的条件是否成立主要体现在命令执行后的返回状态(即 $?),所以可以在测试后查看变量$?的值来做出判断,或者结合&&、||等逻辑操作显示出结果(或作其他操作)
文件测试
- -e file:检查文件是否存在。
- -f file:检查文件是否存在且为普通文件。
- -d file:检查文件是否存在且为目录。
- -r file:检查文件是否存在且可读。
- -w file:检查文件是否存在且可写。
- -x file:检查文件是否存在且可执行。
- -s file:检查文件是否存在且大小大于0。
字符串比较
- str1 = str2:检查字符串是否相等。
- str1 != str2:检查字符串是否不相等。
- -z str:检查字符串是否为空。
- -n str:检查字符串是否非空。
整数比较
- int1 -eq int2:检查整数是否相等。
- int1 -ne int2:检查整数是否不相等。
- int1 -lt int2:检查整数是否小于。
- int1 -le int2:检查整数是否小于等于。
- int1 -gt int2:检查整数是否大于。
- int1 -ge int2:检查整数是否大于等于。
逻辑操作
- ! expression:逻辑非。
- expression1 -a expression2:逻辑与(AND)。
- expression1 -o expression2:逻辑或(OR)。
二、常用表达式
1、字符串比较测试
格式:[ 操作符 字符串 ] //查看变量的值是否为空
- -z str:检查字符串是否为空
- -n str:检查字符串是否非空
注意:格式必须要有空格
例如:
[root@svr7 ~]# a=100
[root@svr7 ~]# [ -z $a ] //判断变量a为空
[root@svr7 ~]# echo $?
1
可以简化为如下形式:
[root@svr7 ~]# a=100;[ -z $a ];echo $? //利用【;】号可隔开表达式
1
[root@svr7 ~]# [ ! -z $a ] //判断变量a不为空
[root@svr7 ~]# echo $?
0
[root@svr7 ~]# [ -n $a ] //判断变量a不为空
[root@svr7 ~]# echo $?
0
例如:
[root@svr5 ~]# var1="nb" ; var2=""
[root@svr5 ~]# [ -z "$var1" ] && echo "空值" || echo "非空值" //-z查看字符串值为空
非空值
[root@svr5 ~]# [ -z $var2 ] && echo "空值" || echo "非空值"
空值 //变量var2已设置,但无任何值,视为空
常见报错:【! -z】在!与 -z间需要加空格
[root@svr7 ~]# [ !-z $a ]
-bash: !-z: event not found
格式:[ 字符串1 操作符 字符串2 ] //查看变量的值是否相同
- str1 == str2:检查字符串是否相等
- str1 != str2:检查字符串是否不相等
注意:格式必须要有空格
例如:
[root@svr7 ~]# [ abc == abc ] //字符串的值测试是否相同(常量)
[root@svr7 ~]# echo $? //判断上条命令是否正确(0正确,非0错误)
0
[root@svr7 ~]# [ “root” == $USER ] //当前用户是否与root相同(变量)
[root@svr7 ~]# echo $?
0
[root@svr7 ~]# [ “root” != $USER ] //当前用户是否与root不同
[root@svr7 ~]# echo $?
1
常见报错:输入格式错误,未有空格
[root@svr7 ~]# [abc == abc]
bash: [abc: 未找到命令...
2、整数值比较测试
格式:[ 整数值1 操作符 整数值2 ]
- int1 -eq int2:检查整数是否相等
- int1 -ne int2:检查整数是否不相等
- int1 -lt int2:检查整数是否小于
- int1 -le int2:检查整数是否小于等于
- int1 -gt int2:检查整数是否大于
- int1 -ge int2:检查整数是否大于等于
例如:
[root@svr7 opt]# a=10
[root@svr7 opt]# [ $a -eq 9 ];echo $? //测试10等于9,报错
1
[root@svr7 opt]# [ $a -eq 10 ];echo $? //测试10等于10
0
[root@svr7 opt]# [ $a -ne 9 ];echo $? //测试10不等于9
0
[root@svr7 opt]# [ $a -ge 7 ];echo $? //测试10大于或等于7
0
[root@svr7 opt]# [ $a -le 7 ];echo $? //测试10小于或等于7
1
[root@svr7 opt]# [ $a -gt 4 ];echo $? //测试10大于4
0
[root@svr7 opt]# [ $a -lt 4 ];echo $? //测试10小于4
1
例如:
[root@svr5 ~]# X=20 //定义一个测试变量
[root@svr5 ~]# [ $X -eq 20 ] && echo "相等" || echo "不相等"
相等
[root@svr5 ~]# [ $X -eq 30 ] && echo "相等" || echo "不相等"
不相等
[root@svr5 ~]# [ $X -gt 10 ] && echo "大于" || echo "否"
大于
[root@svr5 ~]# [ $X -gt 20 ] && echo "大于" || echo "否"
否
[root@svr5 ~]# [ $X -gt 30 ] && echo "大于" || echo "否"
否
[root@svr5 ~]# [ $X -ge 10 ] && echo "大于或等于" || echo "否"
大于或等于
[root@svr5 ~]# [ $X -ge 20 ] && echo "大于或等于" || echo "否"
大于或等于
[root@svr5 ~]# [ $X -ge 30 ] && echo "大于或等于" || echo "否"
否
例如:提取当前登录的用户数,比较是否大于等于3