bash 之 test 表达式基础

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

大家会bash test肯定会感觉到很陌生吧,但是你一定见过在shell中,使用这类语法:

if [ -f $xxx ];then 
... 
fi

其中[ -f $xxx ]就是test表达式的一种方式之一,也是使用的最多的之一

什么是test表达式

test是大名鼎鼎的GNU软件之一,为Linux的内置命令,表达式在shell中是用于检查文件状态检查、字符串运算 和 数值比较 的表达式

test返回状态值含义

  • 0: 表达式结果为真(true)
  • 1: 表达式结果为假(false)
  • 2: 程序出错(error)

我们来看下返回值

我们可以发现,当表达式为true的时候,返回值为0,当表达式为false的时候,返回值为1,当表达式出现错误的时候,返回值为2

test表达式可以简写为[ ](小括号的形式)形式,关于这点,是shell比较弄混淆的一个点

我举例讲下

test a = b

等同于

[ a = b ]

[]格式如下

空格是不能省略的哦

脚本如下图

执行结果如下

前面介绍的差不多了,那我们开始看看test表达式了?

数值计算

test表达式中没有> <``=``!=这类符号(至少在sh中没有)

那我们怎么进行数值计算呢,test表达式给我们了一系列操作符

具体我们来看下

操作符含义
-nq等于
-ne不等于
-ge大于或等于
gt大于
-le小于或等于
-lt小于

我们来尝试下

我们使用debug运行一下并且查看结果

你是否感觉到苦恼,实在是记不住eqne等应该怎么办

哎,不要急,bash提供了新的特性,可以使用[[ ]]来包含表达式,该表达式就可以写=!=等,我们来尝试下

我们运行一下脚本,查看一下结果

注意: ****这个特性是指的是bash ,而使用sh则会出错

我们使用一下sh执行一下,查看一下报错

字符串比较

对于字符串比较,test给我们提供的方法有 比较2个字符串是否相等比较2个字符串是否不相等判断字符是否为空判断字符串是否非空

操作符含义
str1 = str2str1 等于 str2
str1 != str2str1 不等于 str2
-z str1str1 为空
-n str1str1 不为空

好的,我们从案例中来看看具体含义

我们执行脚本来看下具体输出

文件/属性比较

test不仅只有 数值判断 和 字符串判断 ,更为强大的是,它还具有文件判断功能

由于判断类型比较多,所以,就只放常用的就行了

文件判断

操作符含义
-e文件是否存在
-f文件存在且为 文件
-d文件存在且为 目录

我们看一个例子

我们新建目录 pdudo_jujin_test并且做3个判断,我们使用test来写表达式

属性判断

操作符含义
-r该文件是否有 读 权限
-w该文件是否有 写 权限
-x该文件是否有 执行 权限
-s该文件是否为非空

我们来看一个例子,我们新建一个空文件: juejin_pdudo_files,并且来判断属性,我们使用[]来写表达式

总结

我们总结了比较简单的使用,还有一些,我们作为高级特性来呈现,结合自身学习来看的话,一次性学习的太多,很容易弄混淆。

我们在进行数字比较的时候,若不想使用 -eq等表达式,可以尝试下使用bash特性,使用 [[ ]]包含表达式,例如: =!=><等,但是作为一般运维人员,使用[[ ]]是会被人耻笑的,且程序健壮性不强(bash特性,切换至其他sh脚本有可能会失败),所以几乎尽量不使用[[]]包含表达式。

之所以test强大,是因为可以检测文件/属性判断,所以一直依赖,它都将是我们运维的利器,基础我们了解了,后期我们可以看看test表达式,适用于哪些脚本,将会如何呈现出来。

posted @ 2022-04-16 19:49  pdudos  阅读(0)  评论(0)    收藏  举报  来源