查看原文
其他

Shell基础(10)-条件判断3

Cloud研习社 Cloud研习社 2023-06-06


每周二、四、六定期更新!




文件测试



文件的测试主要针对文件本身的一些测试,比如文件是否存在、用户对该文件是否拥有相应的权限等。
[ -a FILE ]      # 文件FILE是否存在,如果存在则返回true,否则返回false
[ -e FILE ]      # 作用-a FILE
[ -d FILE ]      # FILE是否是一个目录,如果是目录,则返回true,否则返回false
[ -f FILE ]      # FILE是否是一个普通文件,如果是普通文件,则返回true,否则返回false
[ -b FILE ]      # FILE是否为一个块设备文件,如果是块设备文件,则返回true,否则返回false
[ -c FILE ]      # FILE是否为一个字符设备文件,如果是字符设备文件,则返回true,否则返回false
[ -h FILE ]      # FILE是否为一个软连接文件,如果是软连接文件,则返回true,否则返回false
[ -S FILE ]      # FILE是否为套接字文件,如果是,则返回true,否则返回false
[ -p FILE ]      # FILE是否为命名管道文件,如果是,则返回true,否则返回false
[ -L FILE ]      # 同-h FILE的作用相同

[ -r FILE ]
      # 用户对文件是否有可读权限,如果有可读的权限,则返回true,否则返回false
[ -w FILE ]      # 用户对文件是否有可写权限,如果有可写的权限,则返回true,否则返回false
[ -x FILE ]      # 用户对文件是否有可执行的权限,如果有可执行的权限,则返回true,否则返回false
[ -u FILE ]      # 是否拥有suid权限,如果有,则返回true,否则返回false
[ -g FILE ]      # 是否拥有guid权限,如果有,则返回true,否则返回false
[ -k FILE ]      # 是否拥有sticky权限,如果有,则返回true,否则返回false


实例:

# 文件存在性的判断
[root@studyclub jason]# [ -d /etc ] # /etc是一个目录
[root@studyclub jason]# echo $?
0
[root@studyclub jason]# [ -d /etc/redhat-release ] # /etc/redhat-release是文件,不是目录
[root@studyclub jason]# echo $?
1

# 文件权限的判断
[root@studyclub jason]# [ -r /etc/redhat-release ] # 当前用户对文件/etc/redhat-release有读的权限
[root@studyclub jason]# echo $?
0
[root@studyclub jason]# [ -x /etc/redhat-release ] # 当前用户对文件/etc/redhat-release没有执行的权限
[root@studyclub jason]# echo $?
1


作业:符号链接文件、文件权限的判断请自行练习。


组合条件测试




上面我们讲到的都是对某一个条件进行判断,但是在实际应用中单一的条件判断是不能满足需求的,这就需要多个条件组合,一般有以下形式:
第一种形式:
[ EXPR1 -a EXPR2 ]    -a即and,如果EXPR1和EXPR2同时都是真的时候,判断结果才为真。其余任何情况都是假
[ EXPR1 -o EXPR2 ]    -o即or,如果EXPR1和EXPR2至少有一个为真,判断结果都是真,只有EXPR1和EXPR2同时为假的时候,判断结果才为假
[ ! EXPR ]        取反。如果EXPR为真,那么判断结果就是假;如果EXPR为假,那么判断结果就是真


实例演示:

[root@studyclub jason]# file=test_set.sh # 我们这是个普通文件,但是没有可执行全下
[root@studyclub jason]# [ -f "$file" -a -x "$file" ] # 两个条件都满足才能返回真,由于我们没有可执行权限,所以只能返回假
[root@studyclub jason]# echo $?
1
[root@studyclub jason]# [ -f "$file" -o -x "$file" ] # 有一个条件是真,则返回为真。我们这个test_set.sh文件是普通文件,所以返回为真
[root@studyclub jason]# echo $?
0
[root@studyclub jason]# chmod +x test_set.sh # 为这个test_set.sh文件加上可执行权限
[root@studyclub jason]# [ -f "$file" -a -x "$file" ] # 这个时候测试两个条件都可以满足了,测试结果应该为真
[root@studyclub jason]# echo $?
0

# 取反
[root@studyclub jason]# [ ! -x "$file" ] # 现在test_set.sh文件有x权限了,判断结果应该为真,但是我们取反“!”了,所以为假。
[root@studyclub jason]# echo $?
1


作业:去掉test_set.sh文件的执行权限,练习一下组合条件测试。
第二种形式:&& , ||, !

EXPR1 && EXPR2 并且,和上面的-a作用一样。但是如果EXPR1为假,EXPR2不再执行
EXPR1 || EXPR2 或者,和上面的-o作用一样。如果EXPR1为真,EXPR2不再执行
!EXPR 取非


实例演示:

# 实例1:还是判断文件是不是普通文件并且可执行
[root@studyclub jason]# [ -f "$file" ] && [ -x "$file" ] # 注意看,&&符号的前后分别有[],而不是把&&放到一个[]里面。
[root@studyclub jason]# echo $?
0

# 实例2:
# 看用户sun是否存在,如果不存在,我们就创建它,如果存在,我们就不创建
[root@studyclub jason]# id sun &> /dev/null
[root@studyclub jason]# echo $? # sun这个用户不存在
1
[root@studyclub jason]# id sun &> /dev/null || useradd sun # sun这个用户不存在,那么执行“||”符号后面的,添加用户。
[root@studyclub jason]# id sun &> /dev/null
[root@studyclub jason]# echo $? # 用户已经创建成功了。
0

# 实例3:请谨慎执行哦,执行之前做好虚拟机的快照哈!
# 这个例子完全碰运气哦。如果一个随机数对8取余后为0,则删除根目录的所有内容。如果随机数对8取余后不为0,则表示没能删除根目录,你的运气还不错哦!
[root@studyclub jason]# [ $[RANDOM%8] -eq 0 ] && rm -rf /* || echo "good luck"

# 实例4:ping一个ip地址,如果通了,就提示可达,如果不通,就提示不可达,并退出。
[root@studyclub jason]# ping -c1 -W1 10.0.0.131 &> /dev/null && echo '10.0.0.131 can reached' || (echo '10.0.0.131 is unreachable';exit 1)
10.0.0.131 is unreachable


在实例4中,我们的命令行里出现了小括号(),这是干什么的呢?我们下节讲解。


手应知:

    尝鲜Rocky Linux

《Linux基础及进阶》:

    053 - Shell基础(5)-退出状态码
    054 - Shell基础(6)-set命令实现脚本安全
    055 - Shell基础(7)-算术运算
   056 - Shell基础(8)-算术运算、条件判断1
   057 - Shell基础(9)-条件判断2


看完本文有收获?请分享给更多人


推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!

微信号|bjdream-1


Cloud研习社 · 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存