Shell条件测试)
Posted 连智波
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell条件测试)相关的知识,希望对你有一定的参考价值。
本章内容:
- 条件测试: 主要介绍shell程序中的文件,变量,字符串数值,以及逻辑等条件测试
- 条件判断语句: 介绍基本的if,if else,以及if elif语句的使用方法
- 多条件判断语句case: 主要介绍case语句的基本语法,以及使用case语句来解决一些实际问题
- 运算符: 介绍shell中常用的运算符的使用方法,例如 算术运算符,位运算符,自增,自减运算符
条件测试:
- 条件测试的基本语法:
在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或者假,当指定的条件为真时,整个条件测试的返回值为0;反之,如果条件为假时,则条件测试的返回值为非0
- 条件测试的两个内部命令
test 和[ (左中括号) 两个都是shell中两个用来测试条件表达式真假的内部命令
test的使用方法:
test 1 -eq 2 : 判断 整数1和2是否相等
test string或者 test -z string : 测试字符串是否为空
test -e file : 测试指定的文件是否存在
执行结果:
判断 整数1和2是否相等,返回值为非0,false
测试字符串是否为空
测试指定的文件是否存在
[ 的使用方法: (注意在表达式跟中括号之间有一个空格)
[ 1 -eq 2 ] : 判断 整数1和2是否相等
[ -z string ] : 测试字符串是否为空
[ -e file ] : 测试指定的文件是否存在
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说明不相等
案例2:
比较10大于20 ,10小于20
案例3:
比较变量和常数的大小
案例4:
比较两个变量值的大小
特别提示1:
不可以使用 = 或者 != 运算符来比较两个整数是否相等,因为这两个运算符是用来比较字符串的
看起来结果是一样的,其实[ 12 = 13 ]的真实是这样: [ "12" = "13" ]
特别提示2:
以上的运算符只能用作整数比较,其他类型则不可以,由于变量x为小数,所以比较的时候报错
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条件测试)的主要内容,如果未能解决你的问题,请参考以下文章