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中的所有文件比较符,它们的使用方法可参照之前的例子,只需参考表格中的“文件测试”部分改变相应的文件操作符即可。
3.字符串测试
Shell中的字符串比较主要有等于、不等于、大于、小于、是否为空等测试,可以使用的字符串测试符如下:
下面演示了上述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是整数测试符常见的整数测试符,如下表所示:
5.逻辑测试符和逻辑运算符
逻辑测试用于连接多个测试条件,并返回整个表达式的值。逻辑测试主要有==逻辑非(!)、逻辑与(&&)、逻辑或(||)==3种。逻辑测试符如下表所示:
#例一:逻辑非的使用(两种形式)
#测试值为真的表达式在使用逻辑非后,表达式变为假,反之亦然
[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
当然在实际中,逻辑关系的使用经常是逻辑或、逻辑与和逻辑非联合使用,多使用括号进行分组,可以让逻辑更加清晰。