shell脚本的条件测试与比较

  • 2019-09-02
  • 0
  • 0

1、几种条件测试常用语法

测试语法 说明
test 测试表达式 利用test进行条件测试
[ 测试表达式 ] 中括号与测试表达式中间需有空格,常用
[[ 测试表达式 ]] 用于正则
((测试表达式)) 一般用于if语句中

说明:
&&||><等操作符可以应用于[[]]中,但不能用于[]中,在[]中一般用-a-o-gt-lt代替上述操作符。

示例:

# 判断文件存在则为真,否则为假
[root@shell ~]# test -f /etc/hosts && echo true || echo false
true
# 判断文件存在则为真,否则为假,通test用法
[root@shell ~]# [ -f /etc/hosts ] && echo true || echo false
true

2、常用的文件测试操作符

常用操作符 说明
-d 文件存在且为目录则为真
-f 文件存在且为普通文件则为真
-e 文件存在则为真,区别于”-f” -e不辨别是目录还是文件
-r 文件存在且可读则为真
-s 文件存在且大小不为0则为真
-w 文件存在且可写则为真
-x 文件存在且可执行则为真
-L 文件存在且为链接文件则为真
[root@shell ~]# test -f /etc/hosts && echo true || echo false
true
[root@shell ~]# [ -f /etc/hosts ] && echo true || echo false
true
[root@shell ~]# [ -f /etc/hosts ] && echo 为真 || echo 为假
为真
[root@shell ~]# [ -f /etc/hostsss ] && echo 为真 || echo 为假
为假
[root@shell ~]#  [ -d /etc/hosts ] && echo 为真 || echo 为假
为假
[root@shell ~]#  [ ! -d /etc/hosts ] && echo 为真 || echo 为假
为真
[root@shell ~]# [ -x /etc/hosts ] && echo 为真 || echo 为假
为假

3、数值的比较

在[]以及test中使用的比较符 在(())和[[]]中使用的比较符 说明
-eq ==或= 相等,equal
-ne != 不相等,not equal
-gt > 大于,greater than
-ge >= 大于等于,greater equal
-lt < 小于,less than
-le <= 小于等于,less equal

4、字符串的比较

字符串必须使用双引号
    [ "name" = "name" ] 
    [ "name" != "name" ] 
    [root@web ~]# [ "$USER" = "root" ]
    [root@web ~]# echo $USER
    root
    [root@web ~]# [ "$USER" = "root" ]
    [root@web ~]# echo $?
    0
    [root@web ~]# [ "$USER" = "alex" ]
    [root@web ~]# echo $?
    1
    [root@web ~]# [ "$USER" != "alex" ]
    [root@web ~]# echo $?
    0
    -z  -n
    [root@web ~]# name=""
    [root@web ~]# [ -z $name ]
    [root@web ~]# echo $?
    0
    [root@web ~]# [ ! -z $name ]
    [root@web ~]# echo $?
    1
    [root@web ~]# name="alex"
    [root@web ~]# [ -z $name ]
    [root@web ~]# echo $?
    1
    [root@web ~]# [ -n $name ]
    [root@web ~]# echo $?
    0
    -z 案例:
    read -p "请输入名字" name1 
    [ -z $name1 ] && echo "请输入姓名否则不继续执行" && exit
    read -p "请输入年龄" age1
    echo $name1 $age1

    正则比对
    [[]]
    [root@shell scripts]# [ "$USER" = "root" ]
    [root@shell scripts]# echo $?
    0
    [root@shell scripts]# [[ "$USER" =~ ^r ]]
    [root@shell scripts]# echo $?
    0
    [root@shell scripts]# [[ "$USER" =~ t$ ]]
    [root@shell scripts]# echo $?
    0
    [root@shell scripts]# [[ ! "$USER" =~ t$ ]]
    [root@shell scripts]# echo $?
    1
    判读传参的参数是否为整数
    方法1
    [root@shell scripts]# age=188
    [root@shell scripts]# 
    [root@shell scripts]# 
    [root@shell scripts]# [[ "$age" =~ ^[0-9]+$ ]]
    [root@shell scripts]# echo $?
    0
    [root@shell scripts]# age=188q
    [root@shell scripts]# [[ "$age" =~ ^[0-9]+$ ]] && echo $?
    [root@shell scripts]# [[ "$age" =~ ^[0-9]+$ ]] || echo $?
    1
    [root@shell scripts]# age=18.8
    [root@shell scripts]# [[ "$age" =~ ^[0-9]+$ ]]
    [root@shell scripts]# echo $?
    1
    方法2
    expr $1 + 0 >/dev/null 2>&1
    [ $? -ne 0 ] && exit

5、逻辑操作符

在[]以及test中使用的操作符 在(())和[[]]中使用的比较符 说明
-a && and,与,两端都为真,则结果为真
-o || or,或,两端有一个为真,则结果为真
! ! not,非,两端相反,则结果为真

6、不同符号测试表达式[ ][[ ]](( ))test

测试表达符号 [] test [[]] (())
边界是否需要空格 需要 需要 需要 不需要
逻辑操作符 !、-a、-o !、-a、-o !、&&、|| !、&&、||
整数比较操作符 -eq、-gt、-lt、-ge、-le -eq、-gt、-lt、-ge、-le -eq、-gt、-lt、-ge、-le或=、>、<、<=、>= =、>、<、<=、>=
字符串比较操作符 =、==、!= =、==、!= =、==、!= =、==、!=
是否支持通配符匹配 不支持 不支持 支持 不支持
# [[ ]] 不等于 !要加前面
[root@shell ~]# [[ ! "$USER" =~ r$ ]]
[root@shell ~]# echo $?              
0
[root@shell ~]# [[ "$USER" !=~ r$ ]]  
-bash: conditional binary operator expected
-bash: syntax error near `!=~'

两个案例:

# 案例1:批量创建用户 批量创建10个用户 ljc1 ljc2 ljc3...ljc10
        要求密码统一设置为123456
        1.输入用户的前缀  ljc
          判断如果为空 则退出
        2.输入需要创建用户的个数 10
          判断是否为整数
[root@shell scripts]# cat useradd.sh
#!/bin/sh
#read -p "please input prefix: " name
#read -p "创建的个数: " num
for i in {1..10}
do
    echo ljc$i
done

[root@shell scripts]# cat useradd.sh 
#!/bin/sh
read -p "please input prefix: " name
read -p "创建的个数: " num
for i in `seq $num`
do
    useradd $name$i >/dev/null 2>&1
    echo 123456|passwd --stdin $name$i &>/dev/null
    [ $? -eq 0 ] && echo "$name$i create is ok"
done

# 案例2:
判断当前10.0.0.0/24网络中 有哪些IP地址在线 ping通则在线
[root@shell scripts]# cat ping.sh 
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
for i in `seq 254`
do
    { IP=10.0.0.$i
    ping -c 1 -W 1 $IP >/dev/null 2>&1
    [ $? -eq 0 ] && action "ping $IP is" /bin/true
    } &
done
```
```markdown

评论

还没有任何评论,你来说两句吧

提供支持 - 友情链接 - 衫小寨