shell脚本学习之基础篇二:条件判断

一、条件判断

1、语法格式

  • test 条件表达式
  • [ 条件表达式 ]
  • [[ 条件表达式 ]]

2、文件判断

参数含义
-e判断文件或目录是否存在
-d判断是不是目录以及是否存在
-f判断是不是普通文件以及是否存在
-r判断是否有读权限
-w判断是否有写权限
-x判断是否有执行权限
-L判断是否为软链接文件
-ef判断两个文件是否相等,inode相同
-s判断文件是否为非空文件,空文件用! -s

判断name.sh文件是否存在

[root@server myscripts]# test -e name.sh 
[root@server myscripts]# echo $?
0

判断name.sh文件存在则打印yes

[root@server myscripts]# [ -e name.sh ] && echo yes
yes
[root@server myscripts]# [[ -f name.sh ]]&&echo yes
yes

判断name.sh是否存在,是否是一个目录,无论结果怎样都输出yes

[root@server myscripts]# [ -e name.sh ];echo yes
yes
[root@server myscripts]# [ -d name.sh ];echo yes
yes

当name.sh不是一个普通文件时输出yes,否则输出no

[root@server myscripts]# [[ ! -f name.sh ]] && echo yes || echo no
no

判断2个文件的新旧:-nt比新,-ot比旧

[root@server myscripts]# ll
-rw-r--r-- 1 root root 463 7月  18 17:04 tri.sh
-rw-r--r-- 1 root root 139 7月  20 17:26 var.sh
[root@server myscripts]# [ tri.sh -nt var.sh ];echo $?
1
[root@server myscripts]# [ tri.sh -ot var.sh ];echo $?
0

判断2个文件是否是一个文件(即使内容相同也不一定就是一个文件,要inode相同)

[root@server myscripts]# [ tri.sh -ef var.sh ];echo $?
1

3、整数判断

参数含义
-eq等于
-ge大于等于
-gt大于
-le小于等于
-lt小于
-ne不等于
[root@server myscripts]# [ 1 -eq 2 ];echo $?
1
[root@server myscripts]# [ 1 -ne 2 ];echo $?
0
[root@server myscripts]# [ 1 -le 2 ];echo $?
0
[root@server myscripts]# [ 1 -lt 2 ];echo $?
0

4、字符串判断

参数含义
-z判断字符串是否为空
-n判断字符串是否为非空
string1 = string2判断字符串是否相等
string1 != string2判断字符串是否不等
[root@server myscripts]# [ -z "hello" ];echo $?
1
[root@server myscripts]# [ -n "hello" ];echo $?
0
[root@server myscripts]# [ -n " " ];echo $?  //空格也算一个字符哦!
0
[root@server myscripts]# [ -n "" ];echo $?
1
[root@server myscripts]# [ -z "" ];echo $?
0
[root@server myscripts]# [ "hello" = "world" ];echo $? //字符串最好用引号引起来
1
[root@server myscripts]# [ "hello" != "world" ];echo $?
0

5、多重条件判断

参数含义举例
-a逻辑与[ 1 -eq 1 -a 1 -ne 2 ]或 [ 1 -eq 1 ] && [ 1 -ne 2 ]
-o逻辑或[ 1 -eq 1 -o 1 -ne 2 ] 或 [ 1 -eq 1 ] || [ 1 -ne 2 ]

注意:

参数含义
&&前面的表达式为真,才会执行后面的表达式
||前面的表达式为假,才会执行后面的表达式
只用于分割多个表达式,表达式按从左到右执行,它不具备判断能力

例1:判断是否为系统管理员,root的uid=0

[root@server myscripts]# [ $(id -u) -eq 0 ] && echo "admin"
admin
[root@server myscripts]# su - stu40
[stu40@server ~]$ [ $(id -u) -eq 0 ] && echo "admin"
[stu40@server ~]$ [ $(id -u) -eq 0 ] || echo "admin"
admin
[stu40@server ~]$ [ $(id -u) -eq 0 ] && echo "admin" || echo "is not admin"
is not admin
[stu40@server ~]$ exit
登出
[root@server myscripts]# [ $(id -u) -eq 0 ] && echo "admin" || echo "is not admin"
admin

注意:&&和||同时在的情况下,没有优先级之分,按从左往右的顺序进行判断

[root@server myscripts]# [ 1 -eq 2 ] && echo AAA || echo BBB && echo CCC
BBB
CCC

6、类C风格的数值判断

注意:在(())中,不能用=,=是赋值的意思,要用==判断是否相等

[root@server myscripts]# (( 1==1 ));echo $?
0
[root@server myscripts]# 
[root@server myscripts]# (( 1>=2 ));echo $?
1
[root@server myscripts]# ((1>=2));echo $?
1
[root@server myscripts]# ((1!=2));echo $?
0

7、类C风格的字符串判断

注意:字符串比较的时候,在[]里,用=或者==都表示判断

[root@server myscripts]# A=hello
[root@server myscripts]# B=world
[root@server myscripts]# [ "$A" = "$B" ];echo $?
1
[root@server myscripts]# [ "$A" != "$B" ];echo $?
0
[root@server myscripts]# [ "$A" == "$B" ];echo $?
1

8、关于[ ]和[[ ]]的区别

在跟一个空字符串比较的时候,[]必须要加引号,而[[ ]]不需要

[root@server myscripts]# A=
[root@server myscripts]# 
[root@server myscripts]# [ $A = $B ];echo $?
-bash: [: =: 期待一元表达式
2
[root@server myscripts]# [ "$A" = "$B" ];echo $?
1
[root@server myscripts]# [[ $A = $B ]];echo $?
1

在[[ ]]里面可以用&&来进行逻辑与运算,而在[ ]里不行,只能用-a

[root@server myscripts]# [ 1 -eq 1 -a 1 -lt 2 ];echo $?
0
[root@server myscripts]# [ 1 -eq 1 && 1 -lt 2 ];echo $?
-bash: [: 缺少 `]'
2
[root@server myscripts]# [[ 1 -eq 1 && 1 -lt 2 ]];echo $?
0
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值