三、shell条件测试

这篇博客详细介绍了Shell脚本中的条件测试语法,包括test、[]、[[[]]]和(( ))的不同用法,并展示了文件测试表达式如何检查文件属性,如是否存在、权限等。同时,还讲解了字符串和整数的测试表达式,以及逻辑操作符的使用。通过实例演示了如何在脚本中判断字符串长度、文件属性以及整数比较。最后,给出了一个读取用户输入并根据输入值执行不同操作的脚本示例。
摘要由CSDN通过智能技术生成

1.  条件测试的基本语法:

        在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假。当指定的条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。

条件测试语法
说明
语法1: test <测试
表达式>
test命令和<测试表达式>之间至少有一个空格
语法2[ <测试表
达式> ]
该方法和test命令的用法一样,[ ]的边界和内容之间至少有一个空格
语法3[[ <测试
表达式> ]]
test[]更新的语法格式。[ [ ] ]的边界和内容之间至少有一个空格。[ [ ] ]中可以使用通配符等进行模式匹配
语法4:((<测试表达
>))
一般用于if语句里,双小括号两端不需要有空格,测试对象只能是整数

2.  文件测试表达式:

        

常用的文件测试操作符
说明
-a/-e 文件
文件是否存在
-b 文件
文件是否存在,且为块文件,如果文件存在且是一个块文件,则结果为0
-c 文件
文件是否存在且为字符文件,如果文件存在且是一个字符文件,则结果为0
-L 文件
文件存在且为链接文件则为真
-d 文件
文件存在且为目录则为真,即测试表达式成立
-f 文件
文件存在且为普通文件则为真,即测试表达式成立
-s 文件
文件存在且文件大小不为0则为真
-u 文件
文件是否设置suid位,如果设置了suid,则结果为0
-r 文件
文件存在且可读为真
-w 文件
文件存在且可写为真
-x 文件
文件存在且可执行则为真
f1 -nt f2ntnewer
than
文件f1比文件f2新则为真,根据文件的修改时间来计算
f1 -ot f2otolder
than
文件f1比文件f2旧则为真,根据文件的修改时间来计算
测试文件的读、写、执行等属性,不光是根据文件属性rwx的标识来判断,还要看当前执行测试的用户是否真的可以按照对应的权限操作文件。
1>.  test示例:
[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file
[root@localhost test3]# test -f file;echo $?
0
[root@localhost test3]# test -f file1;echo $?
1
[root@localhost test3]# test -x file;echo $?
1

2>.   [ ]示例(注意测试表达式和方括号两边需要有空格):

[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file
[root@localhost test3]# [ -f file ];echo $?
0
[root@localhost test3]# [ -f file1 ];echo $?
1
[root@localhost test3]# [ -w file ];echo $?
0

3>.   [ [ ] ]示例(注意测试表达式和[[]]两边需要有空格):

[root@localhost test3]# ll
total 0
-rw-r--r--. 1 root root 0 Feb 20 10:35 file 
[root@localhost test3]# [[ -f file ]];echo $?
0
[root@localhost test3]# [[ -f file1 ]];echo $?
1
[root@localhost test3]# [[ -x file ]];echo $?
1
注意:如果测试的文件路径是用变量来代替,变量一定要加引号。
3.  字符串测试表达式:
常用字符串测试操作
说明
-n “字符串
若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero
-z “字符串
若字符串的长度为0,则为真,z可以理解为zero
1”=“2”
若字符串1等于字符串2,则为真,可使用==代替=
1”!=“2
若字符串1不等于字符串2,则为真

1>.  test示例:

[root@localhost test3]# test -n abc;echo $?
0
[root@localhost test3]# test -n "";echo $?
1
[root@localhost test3]# test -n " ";echo $?
0
[root@localhost test3]# test -z '';echo $?
0
[root@localhost test3]# test -z abc;echo $?
1
[root@localhost test3]# test -z ' ';echo $?
1
[root@localhost test3]# test abc = abcd ;echo $? #注意等号两边需要有空格
1
[root@localhost test3]# test abc=abcd ;echo $?
0

2>.  [ ]示例:

[root@localhost test3]# [ -n '' ];echo $?
1
[root@localhost test3]# [ -n ' ' ];echo $?
0
[root@localhost test3]# [ -z '' ];echo $?
0
[root@localhost test3]# [ abc=abcd ];echo $?
0
[root@localhost test3]# [ abc = abcd ];echo $? #注意等号两边需要有空格
1

3>.  [ [ ] ]示例:

[root@localhost test3]# [[ -n abc ]];echo $?
0
[root@localhost test3]# [[ -n ' ' ]];echo $?
0
[root@localhost test3]# [[ -n '' ]];echo $?
1
[root@localhost test3]# [[ abc=acd ]] ;echo $?
0
[root@localhost test3]# [[ abc = acd ]] ;echo $? #注意等号两边需要有空格
1

注意:测试对象是变量时,变量需要加引号 。

4.  整数测试表达式:

[]以及test中使用的比较符
(())[[]]中使用的比较符
说明
-eq
===
相等,全拼为equal
-ne
!=
不相等,全拼为not equal
-gt
>
大于,全拼为greater than
-ge
>=
大于等于,全拼为greater
equal
-lt
<
小于,全拼为less than
-le
<=
小于等于,全拼为less equal
注意:
        =和!=也可在[]中作比较时使用,在[]中也可使用>和<符号,但需要使用反斜线转义,有时不转译虽然语法不会报错,但是结果可能会不对。
        在[ [ ] ]中也可使用包含-gt和-lt的符号,不建议使用。
        比较符号两端也要有空格。
1>.  test示例:
[root@localhost test3]# test 2 -eq 3;echo $?
1
[root@localhost test3]# test 2 -eq 2;echo $?
0
2>.  [ ]示例:
[root@localhost test3]# [ 2 -ne 3 ];echo $?
0
[root@localhost test3]# [ 2 -ne 2 ];echo $?
1
3>.  [ [ ] ]示例
[root@localhost test3]# [[ 2 != 3 ]];echo $?
0
[root@localhost test3]# [[ 2 != 2 ]];echo $?
1
[root@localhost test3]# [[ 2!=2 ]];echo $? 未写空格,导致出错
0
4>.  ( ( ) )示例:
[root@localhost test3]# (( 2!=3 ));echo $?
0
[root@localhost test3]# ((2!=3));echo $?
0
[root@localhost test3]# ((2=3));echo $?
-bash: ((: 2=3: attempted assignment to non-variable (error token is "=3")
1
[root@localhost test3]# ((2==3));echo $?
1
[root@localhost test3]# ((2>3));echo $?
1
[root@localhost test3]# ((2<3));echo $?
0

 5.  逻辑操作符

[]中使用的逻辑操作符
test[[]](())中使用的逻辑操作符
说明
-a
&&
and,与,两端都为真,则结果为真
-o
||
or,或,两端有一个为真,则结果为真
not,非,两端相反,则结果为真

 1>.  test示例

[root@localhost test3]# ll
total 0
drwxr-xr-x. 2 root root 6 Feb 20 11:47 ceshi
-rw-r--r--. 1 root root 0 Feb 20 10:46 file
[root@localhost test3]# test -f file && echo 1 ||echo 0
1
[root@localhost test3]# test -f file1 && echo 1 ||echo 0
0
[root@localhost test3]# ! test -f file;echo $?
1
注:命令1 && 命令2,如果命令1执行不成功,则命令2不执行。
       命令3 || 命令4,如果命令3成功,不执行命令4;如果命令3不成功,则执行命令4。
2>.  [ ]示例:
[root@localhost test3]# [ -f ceshi -a -f file ];echo $?
1
[root@localhost test3]# [ -e ceshi -a -f file ];echo $?
0
[root@localhost test3]# [ -f ceshi -o -f file ];echo $?
0
[root@localhost test3]# [ -f ceshi ];echo $?
1
[root@localhost test3]# ! [ -f ceshi ];echo $?
0
[root@localhost test3]# [ ! -f ceshi ];echo $?
0
3>.  [ [ ] ]示例:
[root@localhost test3]# [[ -f file && -f ceshi ]];echo $?
1
[root@localhost test3]# [[ -f file || -f ceshi ]];echo $?
0
[root@localhost test3]# [[ -f file && -d ceshi ]];echo $?
0
4>.   ( ( ) )示例
[root@localhost test3]# ((2>3&&3>4));echo $?
1
[root@localhost test3]# ((2<3&&3<4));echo $?
0
实验1:通过read传入一个数字,如果传入的数字等于1,就打印1;如果等于2,就打印2,如果不等于1也不等于2,就提示输入不对,然后退出程序。
[root@localhost test3]# cat ./1.sh
#!/bin/bash
# "-p"选项表示键盘输入数据 将输入的数据赋值给num变量
read -p "please input a number:" num
[ "$num" -eq 1 ] && {
        echo 1
        exit 0
}
[ "$num" -eq 2 ] && {
        echo 2
        exit 0
}
[ "$num" -ne 1 -a "$num" -ne 2 ] && {
        echo error
        exit 0
}
[root@localhost test3]# ./1.sh
please input a number:3
error
[root@localhost test3]# ./1.sh
please input a number:1
1
[root@localhost test3]# ./1.sh
please input a number:2
2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值