昨天我们看了一下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
输出命令
我们执行脚本
可以看到,如果我们直接去删除,那么执行的命令将会不可挽回的,而当我们删除前去判断一下,我们就可以避免该错误操作。
运维对自己“不自信”,其实也未必是坏事。