bash之test表达式基础-2
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
昨天我们看了一下test表达式: 数字比较、字符串比较、文件/权限比较,今天我们继续来看看test式子的案例,接着我们再来看看test表达式余下的部分: and/or/非、文件内容比较 还有余下的 文件比较
test表达式基础
逻辑运算符
| 操作符 | 含义 | |
|---|---|---|
| -a | and(&&) | |
| -o | or( | ) |
| ! | 非(!) |
我们来尝试下
写一个脚本判断用户输入的字符是否是 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
可以看到,newfiles和 newfiles3比较,返回值为 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输出命令
我们执行脚本
可以看到,如果我们直接去删除,那么执行的命令将会不可挽回的,而当我们删除前去判断一下,我们就可以避免该错误操作。
运维对自己“不自信”,其实也未必是坏事。

浙公网安备 33010602011771号