Shell条件测试)

Posted 连智波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell条件测试)相关的知识,希望对你有一定的参考价值。

本章内容:

  • 条件测试: 主要介绍shell程序中的文件,变量,字符串数值,以及逻辑等条件测试
  • 条件判断语句: 介绍基本的if,if else,以及if elif语句的使用方法
  • 多条件判断语句case: 主要介绍case语句的基本语法,以及使用case语句来解决一些实际问题
  • 运算符: 介绍shell中常用的运算符的使用方法,例如 算术运算符,位运算符,自增,自减运算符

​条件测试:

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

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

  1. 条件测试的两个内部命令

test 和[ (左中括号) 两个都是shell中两个用来测试条件表达式真假的内部命令

test的使用方法:

test 1 -eq 2 : 判断 整数1和2是否相等

test string或者 test -z string : 测试字符串是否为空

test -e file : 测试指定的文件是否存在

执行结果:

判断 整数1和2是否相等,返回值为非0,false

Shell

测试字符串是否为空

Shell

测试指定的文件是否存在

Shell

[ 的使用方法: (注意在表达式跟中括号之间有一个空格)

[ 1 -eq 2 ] : 判断 整数1和2是否相等

Shell[ -z string ] : 测试字符串是否为空

Shell

Shell

[ -e file ] : 测试指定的文件是否存在

Shell

3.字符串测试

​在shell中,用户可以通过5中运算符来对字符串进行操作

运算符

 说明

string

判断指定的字符串是否为空

-z string

判断字符串是否为空字符串

string1 != string2

判断两个字符串是否不相等

-n string

判断字符串是否为空字符串

string1 = string2

判断指定的两个字符串是否相等

说明: 在以上这5中运算符中,除了string只能使用test进行测试之外,其他的4中可以分别使用test和[ 来进行测试

案例1:

测试字符串是否为空

#定义一个变量:

[root@django ~]# a=abc

#用test变量测试字符串是否为空

[root@django ~]# test $a

#输出结果为0,表示变量a不为空

[root@django ~]# echo $?

0

#用-n测试变量a是否不为空

[root@django ~]# test -n "$a"

#结果为0,说明变量a不为空

[root@django ~]# echo $?

0

#用-z测试变量a是否为空

[root@django ~]# test -z "$a"

#结果为1,说明变量a不为空

[root@django ~]# echo $?

[root@django ~]# 1

案例2:

测试两个字符串:

#定义变量a

[root@django ~]# a="hello"

#定义变量b

[root@django ~]# b="world"

#比较两个字符串是否相等

[root@django ~]# [ "$a" = "$b" ]

#输出测试结果为1,表示$a和$b不相等

[root@django ~]# echo $?1

#测试$a和$b是否不相等

[root@django ~]# test "$a" != "$b"

#结果为0,说明$a和$b不相等

[root@django ~]# echo $?

0

案例3:

​空格对字符串测试的影响

在实际操作中会遇到字符串有空格的情况

#定义变量a

[root@django ~]# a=Hello world

#定义变量b

[root@django ~]# b=Hello world

#测试变量a与变量b是否相等

[root@django ~]# [ "$a" = "$b" ]

[root@django ~]# echo $?

1

分析: 由于变量a末尾有一个空格,所以两个变量值不相等

案例4:

​字母大小写对字符串测试的影响

#定义变量a

[root@django ~]# a=Hello world

#定义变量b

[root@django ~]# b=hello world

#由于变量b中h为小写,所以两个变量值不相等

[root@django ~]# [ "$a" = "$b" ]

[root@django ~]# echo $?

1

案例5:

​运算符两边必须要保留空格

#定义变量a

[root@django ~]# a="Apple"

#定义变量b

[root@django ~]# b="Orange"

#由于=号两边没有空格,所以表达式会变为: test "Apple=Orage",变成了测试某个字符串是否为空,所以结果为真

[root@django ~]# test "$a"="$b"

[root@django ~]# echo $?

0

4.整数测试

​整数测试也有两种形式:

test num1 op num2

或者

[ num1 op num20 ]

其中 num1 和 num2是参与比较的两个整数,可以是常量或者变量, op表示运算符

常见的整数运算符

运算符

说明

num1  -gt num2

比较num1是否大于num2

num1  -lt num2

比较num1是否小于num2

num1  -ge num2

比较num1是否大于等于num2

num1  -le num2

比较num1是否小于等于num2

num1 -eq num2

比较num1是否等于num2,如果相等,测试结果为0

num1 -ne num2

比较num1 和num2是否不相等,如果num1和num2不相等,测试结果为0

案例1:

​比较10和20是否相等,结果为1说明不相等

Shell

案例2:

比较10大于20 ,10小于20

Shell

案例3:

​比较变量和常数的大小

Shell

案例4:

​比较两个变量值的大小

Shell

特别提示1:

不可以使用 = 或者 != 运算符来比较两个整数是否相等,因为这两个运算符是用来比较字符串的

Shell

看起来结果是一样的,其实[ 12 = 13 ]的真实是这样: [ "12" = "13" ]

特别提示2:

以上的运算符只能用作整数比较,其他类型则不可以,由于变量x为小数,所以比较的时候报错

Shell

5.文件测试

​文件测试主要是判断文件是否存在,文件是否可读写

文件测试语法:

test op file 或者 [ op file ] ,其中op表示操作符,file表示要测试的文件名

常用的文件操作符:

操作符

说明

-a file

判断文件是否存在

-b file

文件是否存在,且为块文件

-c file

文件是否存在,且为字符文件

-d file

文件是否存在,且为目录

-e file

同 -a file

-x file

文件是否存在 且可执行

-s file

文件的长度是否大于0,或者文件为非空文件

-L file

文件是否存在且为符号链接文件

-r file

文件是否存在 且为可读

-u file

文件是否设置suid位

-f file

文件存在,且为常规文件

-w file

文件是否存在且为科协

从以上表格可以分析: 文件操作符的功能主要是检测文件是否存在,文件的类型,以及文件的访问权限

案例1:

#判断文件是否存在

[root@django ~]# test -a abc.txt

[root@django ~]# echo $?

0

[root@django ~]# [ -a file3 ]

[root@django ~]# echo $?

1

#判断文件是否为目录

[root@django ~]# test -d dir1

[root@django ~]# echo $?

1

#判断文件是否为常规文件

[root@django ~]# test -f abc.txt

[root@django ~]# echo $?

0

#判断文件是否为非空文件

[root@django ~]# test -s abc.txt

[root@django ~]# echo $?

0

#判断文件是否我块文件

[root@django ~]# test -b file1

[root@django ~]# echo $?

1

#判断/dev/sda是否为块文件

[root@django ~]# test -b /dev/sda

[root@django ~]# echo $?

0

#判断/dev/tty是否为字符文件

[root@django ~]# test -c /dev/tty

[root@django ~]# echo $?

0

案例2:

​判断文件的权限

#判断文件是否可写

[root@django ~]# test -w abc.txt

[root@django ~]# echo $?

0

#判断文件是否可读

[root@django ~]# test -r abc.txt

[root@django ~]# echo $?

0

#判断文件是否可执行

[root@django ~]# test -x abc.txt

[root@django ~]# echo $?

1

#设置文件的setuid权限,然后判断

[root@django ~]# ll abc.txt

-rwxr-xr-x 1 root root 3 Feb 20 14:51 abc.txt

[root@django ~]# chmod u+s abc.txt

[root@django ~]# ll abc.txt

-rwsr-xr-x 1 root root 3 Feb 20 14:51 abc.txt

[root@django ~]# test -u abc.txt

[root@django ~]# echo $?

0

6.逻辑操作符

​前面介绍的字符串测试,整数测试,以及文件测试都是提供了一个测试条件. 而在shell中,经常遇到同时判断多个条件的情况,这个时候就要用到逻辑操作符

常用的逻辑操作符:

操作符

说明

!expression

逻辑非,expression的条件为真时,结果为假

expression1 -o expression2

逻辑或,两个条件只要有一个为真,则结果为真

expression1 -a expression2

逻辑与,两个条件都为真时,结果为真

案例1:

[root@django ~]# a=35

[root@django ~]# test "$a" -gt 20 -a "$a" -lt 60

[root@django ~]# echo $?

0

[root@django ~]#

案例2:

​判断当前用户对某个文件是否有写入权限

[root@django ~]# [ -e file1 -a -w file1 ]

[root@django ~]# echo $?

1

以上是关于Shell条件测试)的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本的条件测试与比较

Shell编程-05-Shell中条件测试与比较

shell编程之条件测试

shell-条件测试

Shell编程之条件语句——条件测试

shell脚本的条件测试与比较