十三、SHELL条件测试
一、命令执行结果判定
&& 在命令执行后如果没有任何报错时会执行符号后面的动作
|| 在命令执行后如果命令有报错会执行符号后的动作
示例:
[root@node ~]# vim sen.sh
#!/bin/bash
ls /mnt/file &> /dev/null && {
echo /mnt/file is exist
echo yes
}|| {
echo /mnt/file is not exist
echo no
}
[root@tnode ~]# sh sen.sh
/mnt/file is not exist
no
二、条件判断方法
在shell程序中,用户可以使用测试语句来测试指定的条件表达式的条件的真或假
条件测试语法 | 说明 |
语法1: test< 测试 表达式> | test命令和测试表达式>之间至少有一个空格 |
语法2:[ <测试表 达式> ] | 该方法和test命令的用法一样,[]的边界和内容之间至少有一个空格 |
语法3:[[ <测试表 达式> ]] | 比test和[]更新的语法格式。[[]]的边界和内容之间至少有一个空格。[[]]中可 以使用通配符等进行模式匹配 |
语法4:(( <测试表达 式>)) | 一般用于if语句里,双小括号两端不需要有空格,测试对象只能是整数 |
示例:
1.test示例
[root@node ~]# test $a = $b && echo yes || echo no
yes
2.[]示例
[root@node ~]# [ $a = $b ] && echo yes || echo no
yes
3.[[]]示例
[root@node ~]# a=2
[root@node ~]# [[ $a =~ 2|10 ]] && echo yes || echo no
yes
4.(())示例
[root@node ~]# a=3
(($a > 0,$a<10)) && echo yes
[root@node ~]# a=-1
[root@node ~]# (($a < 0|$a>10)) && echo yes
yes
三、判断表达式
1.文件判断表达式
常用的文件测试操作符 | 说明 |
-a/-e 文件 | 文件是否存在 |
-b 文件 | 文件是否存在,且为块文件,如果文件存在且是一个块文件,则结果 为0 |
-c 文件 | 文件是否存在且为字符文件,如果文件存在且是一个字符文件,则结 果为0 |
-L 文件 | 文件存在且为链接文件则为真 |
-d 文件 | 文件存在且为目录则为真,即测试表达式成立 |
-f 文件 | 文件存在且为普通文件则为真,即测试表达式成立 |
-s 文件 | 文件存在且文件大小不为0则为真 |
-u 文件 | 文件是否设置suid位,如果设置了suid,则结果为0 |
-r 文件 | 文件存在且可读为真 |
-w 文件 | 文件存在且可写为真 |
-x 文件 | 文件存在且可执行则为真 |
f1 -nt f2,nt为newer than | 文件f1比文件f2新则为真,根据文件的修改时间来计算 |
f1 -ot f2,ot为older than | 文件f1比文件f2旧则为真,根据文件的修改时间来计算 |
示例:
a.判断文件是否存在
[root@node ~]# [ -a sen.sh ] && echo yes || echo no
yes
b.判断文件类型
[root@node ~]# [ -d /mnt ] && echo /mnt is directory
/mnt is directory
c.判断文件是否存在并不为空
[root@node ~]# [ -s file ] || echo file is not exist or file is empty file
file is not exist or file is empty file
d.判断文件权限
[root@node ~]# [ -x file ] || echo file is not execute
file is not execute
e.判定文件新旧
[root@node ~]# [ file -ot file1 ] && echo yes
yes
Note
在使用变量作为判断元素时需要用引号引用变量值
当checkdir未被赋值时
[root@node ~]# [ -f $chekdir ] && echo yes || echo no
yes
[root@node ~]# [ -f "$chekdir" ] && echo yes || echo no
no
2.字符串测试表达式
常用字符串测试操作符 | 说明 |
-n “字符串” | 若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero |
-z “字符串” | 若字符串的长度为0,则为真,z可以理解为zero |
“串1”=“串2” | 若字符串1等于字符串2,则为真,可使用==代替= |
“串1”!=“串2” | 若字符串1不等于字符串2,则为真 |
示例:
a.检测变量是否为空
[root@node ~]# LEEVAR=sen
[root@node ~]# [ -z "$LEEVAR" ] && echo yes || echo no
no
[root@node ~]# [ -n "$LEEVAR" ] && echo yes || echo no
yes
b.比较字符
[root@node ~]# LEEVAR=sen
[root@node ~]# LEEVAR1=lazy
[root@node ~]# [ "$$LEEVAR" = "$LEEVAR" ] && echo yes || echo no
no
[root@node ~]# [ "$$LEEVAR" != "$LEEVAR" ] && echo yes || echo no
yes
四、阶段练习脚本
编写脚本效果如下:
[root@node ~]# sh checkfile.sh
please input filename: 当未输入任何字符时回车
Error: no checkfilename,Please input filename for check !! 报错
please input filename: /mnt/leefile 当输入/mnt/leeifle时
文件不存在时
/mnt/file is not exist
当文件存在时输入文件类型
/mnt/file is commom file 注意文件是什么类型就输出文件类型的相关输出
五.整数测试表达式
在[]以及test中使用的比较符 | 在(())和[[]]中使用的比较符号 | 说明 |
-eq | ==或= | 相等,全拼为equal |
-ne | != | 不想等,全拼为not equal |
-gt | > | 大于,全拼为greater equal |
-ge | >= | 大于等于,全拼为greater equal |
-lt | < | 小于,全拼为less than |
-le | <= | 小于等于,全拼为less equal |
示例:
相等或不等
[root@node ~]# A=1;B=1
[root@node ~]# [ "$A" -eq "$B" ] && echo yes || echo no
yes
[root@node ~]# [ "$A" -ne "$B" ] && echo yes || echo no
no
大小对比
[root@node ~]# A=1;B=2
[root@node ~]# [ "$A" -gt "$B" ] && echo yes || echo no
no
[root@node ~]# [ "$A" -ge "$B" ] && echo yes || echo no
no
[root@node ~]# [ "$A" -lt "$B" ] && echo yes || echo no
yes
[root@node ~]# [ "$A" -le "$B" ] && echo yes || echo no
no
六、逻辑操作符
在[]中使用的逻辑操作符 | 在test、[[]]和(())中使用的逻辑操作符 | 说明 |
-a | && | and,与,两端都为真,则结果为真 |
-o | | | | or,或,两端有一个为真,则结果为真 |
! | ! | not,非,两端相反,则结果为真 |
示例:
[root@node ~]# ls -l senfile sen
-rw-r--r-- 1 root root 0 Apr 7 23:59 sen
-rw-r--r-- 1 root root 0 Apr 7 23:59 senfile
test 示例
[root@node ~]# test -f senfile -a -f sen && echo yes || echo no
yes
[root@node ~]# test -f senfile1 -a -f sen && echo yes || echo no
no
[root@node ~]# test -f senfile1 -o -f sen && echo yes || echo no
yes
[root@node ~]# test ! -f senfile1 && echo yes || echo no
yes
[root@node ~]# test -f senfile1 && echo yes || echo no
no
[]示例
[root@node ~]# [ -f "senfile" -a -f "sen" ] && echo yes || echo no
yes
[root@node ~]# [ -f "senfile1" -a -f "sen" ] && echo yes || echo no
no
[root@node ~]# [ -f "senfile1" -o -f "sen" ] && echo yes || echo no
yes
[root@node ~]# [ ! -f "senfile1" ] && echo yes || echo no
yes
[[]]示例
[root@node ~]# [[ -f "senfile" && -f "sen" ]] && echo yes || echo no
yes
[root@node ~]# [[ -f "senfile1" && -f "sen" ]] && echo yes || echo no
no
[root@node ~]# [[ -f "senfile1" || -f "sen" ]] && echo yes || echo no
yes
[root@node ~]# [[ ! -f "senfile1" ]] && echo yes || echo no
yes
(())示例
[root@node ~]# A=3
[root@node ~]# (( $A >=0 && $A<5 )) && echo yes || echo no
yes
原文地址:https://blog.csdn.net/weixin_53445843/article/details/144196097
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!