其他
Shell基础(10)-条件判断3
每周二、四、六定期更新!
文件测试
[ -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
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中,我们的命令行里出现了小括号(),这是干什么的呢?我们下节讲解。
《Linux基础及进阶》:
看完本文有收获?请分享给更多人
推荐关注「Cloud研习社」,带你从零开始掌握云计算技术!
微信号|bjdream-1
Cloud研习社 ·