Shell中内置关键字[[]]

[[ ]] 是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 还能做到。可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能

[[ ]] 的用法为:

[[ expression ]]

# 当 [[ ]] 判断 expression 成立时,退出状态为 0,否则为非 0 值。注意[[ ]]和expression之间的空格,这两个空格是必须的,否则会导致语法错误

"""
[[ ]] 不需要注意某些细枝末节
[[ ]] 是 Shell 内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:

    不需要把变量名用双引号""包围起来,即使变量是空值,也不会出错。
    不需要、也不能对 >、< 进行转义,转义后会出错
"""

[root@server1 mnt]# sh test.sh 
redhat
redhat
str1 >= str2
[root@server1 mnt]# cat test.sh 
#!/bin/bash
read str1
read str2
if [[ -z $str1 ]] || [[ -z $str2 ]]  #不需要对变量名加双引号
then
    echo "字符串不能为空"
elif [[ $str1 < $str2 ]]  #不需要也不能对 < 进行转义
then
    echo "str1 < str2"
else
    echo "str1 >= str2"
fi

[[ ]] 支持逻辑运算符
对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个 test 命令连接起来,例如:

[ -z "$str1" ] || [ -z "$str2" ]
你也可以借助选项把多个表达式写在一个 test 命令中,例如:

[ -z "$str1" -o -z "$str2" ]
但是,这两种写法都有点“别扭”,完美的写法是在一个命令中使用逻辑运算符将多个表达式连接起来。我们的这个愿望在 [[ ]] 中实现了,[[ ]]  支持 &&、|| 和 ! 三种逻辑运算符

使用 [[ ]] 对上面的语句进行改进:
[[ -z $str1 || -z $str2 ]]
这种写法就比较简洁漂亮了

# 注意,[[ ]] 剔除了 test 命令的-o和-a选项,你只能使用 || 和 &&。这意味着,你不能写成下面的形式:[[ -z $str1 -o -z $str2 ]]

# 当然,使用逻辑运算符将多个 [[ ]] 连接起来依然是可以的,因为这是 Shell 本身提供的功能,跟 [[ ]] 或者 test 没有关系,如下所示: [[ -z $str1 ]] || [[ -z $str2 ]]

test 或 []                                                [[ ]]
[ -z "$str1" ] || [ -z "$str2" ]     √     [[ -z $str1 ]] || [[ -z $str2 ]]     √
[ -z "$str1" -o -z "$str2" ]     √         [[ -z $str1 -o -z $str2 ]]     ×
[[ -z $str1 || -z $str2 ]]     ×             [[ -z $str1 || -z $str2 ]]     √

[[ ]] 支持正则表达式
在 Shell [[ ]] 中,可以使用=~来检测字符串是否符合某个正则表达式,它的用法为:
[[ str =~ regex ]]

[root@server1 mnt]# sh test.sh 
239379147
你输入的不是手机号码
[root@server1 mnt]# sh test.sh 
13679276901
你输入的是手机号码
[root@server1 mnt]# cat test.sh 
#!/bin/bash
read tel
if [[ $tel =~ ^1[0-9]{10}$ ]]
then
    echo "你输入的是手机号码"
else
    echo "你输入的不是手机号码"
fi

"""
对^1[0-9]{10}$的说明:

    ^匹配字符串的开头(一个位置);
    [0-9]{10}匹配连续的十个数字;
    $匹配字符串的末尾(一个位置)
"""
 

发布了68 篇原创文章 · 获赞 14 · 访问量 1466

猜你喜欢

转载自blog.csdn.net/qq_41871875/article/details/104286616