shell编程基础(shell脚本学习笔记)

文章目录

  • shell编程基础(shell脚本学习笔记)
  • 测试
  • 1.测试结构
  • 2.文件测试
  • 3.字符串测试
  • 4.整数比较
  • 5.逻辑测试符和逻辑运算符


测试


程序运行中经常需要根据实际情况来运行特定的命令或代码段。比如,判断某个文件或目录是否存在,如果文件或目录不存在,可能需要首先创建文件或目录。这意味着在很多情况下都需要自己来实现这个“判断”的过程。

实际上Shell已经实现了很多测试功能,这些测试语句不但使用起来非常简单,还能在少写代码的情况下实现同样的功能,最重要的是能让代码看起来更为清晰。

1.测试结构

测试的第一种使用方式是直接使用test命令,该命令的格式如下:

test expression

这里的expression是一个表达式,可以是算术比较、字符串比较、文本和文件属性比较等。

第二种测试方式是使用[ expression ],这里需要注意的是 左边的括号“[”后有个空格,右括号“]”前面也有个空格 ,如果任意一边少了空格都会造成Shell报错。推荐使用第二种方式,更加具有可读性。


2.文件测试

Shell中提供了大量的文件测试符,其格式如下:

#文件测试方法一
test file_operator FILE
#文件测试方法二
[ file_operator FILE ]

其中file_operator是文件测试符,FILE是文件、目录(可以是文件或目录的全路径)。

我们以判断文件/var/log/message为例,使用文件测试的方法测试该文件“是否存在”,只需要使用-e操作符即可。

#测试一个存在的文件则$?返回0
[root@localhost ~]# test-e /var/log/messages
[root@localhost ~]# echo $?
0

#测试一个不存在的文件$?返回值不为0
[root@localhost ~]# test-e /var/log/messages01
[root@localhost ~]# echo $?
1

#用[]测试
[root@localhost ~]# [ -e /var/log/messages ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -e /var/log/messages01 ]
[root@localhost ~]# echo $?
1

下表罗列了Shell中的所有文件比较符,它们的使用方法可参照之前的例子,只需参考表格中的“文件测试”部分改变相应的文件操作符即可。

unittest脚本执行顺序 脚本测试分为三个_bash


3.字符串测试

Shell中的字符串比较主要有等于、不等于、大于、小于、是否为空等测试,可以使用的字符串测试符如下:

unittest脚本执行顺序 脚本测试分为三个_linux_02

下面演示了上述6个字符串测试符的用法,其中对str1的测试使用test方式,对str2的测试使用[]方式。

#定义空字符串str1
[root@localhost ~]# str1=""
#测试str1是否为空,为空则返回0
[root@localhost ~]# test -z "$str1"
[root@localhost ~]# echo $?
0
#测试str1是否非空,非空则返回0,为空返回非0,此处返回1
[root@localhost ~]# test -n "$str1"
[root@localhost ~]# echo $?
1

#定义非空字符串str2,值为hello
[root@localhost ~]# str2="hello"
#测试str2是否为空,为空返回0,不为空返回非0,此处返回1
[root@localhost ~]# [ -z "$str2" ]
[root@localhost ~]# echo $?
1
#测试str2是否非空,非空返回0
[root@localhost ~]# [ -n "$str2" ]
[root@localhost ~]# echo $?
0

#比较str1和str2是否相同,相同则返回0,否则返回非0,此处返回1
[root@localhost ~]# [ "$str1" = "$str2" ]
[root@localhost ~]# echo $?
1
#比较str1和str2是否不同,不同则返回0
[root@localhost ~]# [ "$str1" != "$str2" ]
[root@localhost ~]# echo $?
0

#比较str1和str1的大小,需要注意的是,>和<都需要进行转义
[root@localhost ~]# [ "$str1" \> "$str2" ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ "$str1" \< "$str2" ]
[root@localhost ~]# echo $?
0

#如果不想用转义符,则可以用[[]]括起表达式
[root@localhost ~]# [[ "$str1" > "$str2" ]]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [[ "$str1" < "$str2" ]]
[root@localhost ~]# echo $?
0

4.整数比较

**整数测试是一种整数测试是一种简单的算术运算,作用在于比较两个整数的大小关系,测试成立则返回0,否则返回非0值。**整数测试的格式如下:

#整数测试方法一
test "num1" num_operator "num2"
#整数测试方法二
[ "num1" num_operator "num2" ]

其中num_operator是整数测试符常见的整数测试符,如下表所示:

unittest脚本执行顺序 脚本测试分为三个_服务器_03


5.逻辑测试符和逻辑运算符

逻辑测试用于连接多个测试条件,并返回整个表达式的值。逻辑测试主要有==逻辑非(!)、逻辑与(&&)、逻辑或(||)==3种。逻辑测试符如下表所示:

unittest脚本执行顺序 脚本测试分为三个_服务器_04

#例一:逻辑非的使用(两种形式)
#测试值为真的表达式在使用逻辑非后,表达式变为假,反之亦然
[root@localhost ~]# [ !-e /var/log/messages ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# ! [ -e /var/log/messages ]
[root@localhost ~]# echo $?
1

#例二:逻辑与的使用
#表达式都为真,整个表达式才返回真,否则返回假
[root@localhost ~]# [ -e /var/log/messages -a -e /var/log/messages01 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -e /var/log/messages ] && [ -e /var/log/messages01 ]
[root@localhost ~]# echo $?
1

#例三:逻辑或的使用
#测试表达式中只要有真,则整个表达式返回真
[root@localhost ~]# [ -e /var/log/messages -o -e /var/log/messages01 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -e /var/log/messages ] || [ -e /var/log/messages01 ]
[root@localhost ~]# echo $?
0

当然在实际中,逻辑关系的使用经常是逻辑或、逻辑与和逻辑非联合使用,多使用括号进行分组,可以让逻辑更加清晰。