bash之test表达式基础-2

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

昨天我们看了一下test表达式: 数字比较字符串比较文件/权限比较,今天我们继续来看看test式子的案例,接着我们再来看看test表达式余下的部分: and/or/非文件内容比较 还有余下的 文件比较

test表达式基础

逻辑运算符

操作符含义
-aand(&&)
-oor()
!非(!)

我们来尝试下

写一个脚本判断用户输入的字符是否是 y/Y

执行脚本

我们再来看下

来判断下,输入的数字是否是 大于0 并且 小于2

我们执行下看下

我们能否使用 &&||来写呢

是可以的,但是&&||不属于test表达式哦

我们可以将 [ 0 -lt $num -a 2 -gt $num ]改为[ 0 -lt $num ] && [ 2 -gt $num ]||同理,但是这便不算是 test表达式了哦

文件内容比较

操作符含义
file1 -ef file2判断2个文件是否指向同一个inode
file1 -nt file2判断file1是否比file2新
file -ot file2判断file1是否比file2旧

我们来看下-ef

我们接着上一个例子新建文件newfiles3

可以看到,newfilesnewfiles3比较,返回值为 false,证明newfiles不比newfiles3

test案例讲解

字符比较案例

输入Y/n继续操作或则退出操作

我们经常在系统中,或则是脚本中看到使用到 输入Y/n继续或则退出操作,我们使用test表达式模拟一下

其中有些是我们还未看到过的,这里补充下

read从终端输入值,并且赋值给operation,-p是输出提示信息至终端

while是循环语句,while(true) do ... done代表死循环,除非语句中有exit或则break

if elif else fi是判断语法

执行该脚本

数字比较案例

判断web程序是否正常

我们可以使用test表达式来判断web程序是否正常

我们使用curl -I可以获得web服务的响应头,例如

如下就是正常的,且该命令返回值为0,我们请求后,可以看有哪些返回值不为0的,不为0则为不正常

我们可以验证 [][[ ]]

其中 $?会返回上一个命令的返回值,0为成功,非0失败

执行脚本

文件类型判断

脚本加锁/解锁

我们在写脚本过程中,特别是一些依赖上一次运行结果的脚本,不允许同时运行,所以,我们在编写脚本过程中,可以让脚本输出一个“锁”,以便避免同时运行该脚本,我们在判断的时候,可以使用 -f来判断是否存在该锁文件。

我们可以编写例子

单独执行过程是这样的

当执行过程中又有脚本在运行时就会报错

心得

test表达式在整个脚本编写过程中,可谓是举足轻重,它最难的是语法,语法,还是语法,当test表达式改写为[]是,语法格式很重要,如下

一个字符也不要少,否则会出错,若test仅是数字、字符判断,那还不足为奇,更为难得的是,它还能够判断文件/权限的内容,这也将成为linux脚本利器,所以说,学好test表达式,等于入shell编程的小门了。

shell编程中,由于它是脚本语言,所以,在语法这块很轻松,但是它又直接调用系统命令,例如: rm,所以我们在编写过程中,一点要仔细点,最好在写每条语句的时候,都判断下,例如,在脚本中删除文件的时候,我们尽量先判断下是否存在该文件,如下脚本

这是一个比较极端的例子,当我们引用变量名出错的时候,为避免系统出错,我们使用echo输出命令

我们执行脚本

可以看到,如果我们直接去删除,那么执行的命令将会不可挽回的,而当我们删除前去判断一下,我们就可以避免该错误操作。

运维对自己“不自信”,其实也未必是坏事。

posted @ 2022-04-17 21:28  pdudos  阅读(0)  评论(0)    收藏  举报  来源