Shell[[]]详解:检测某个条件是否成立

[[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。

在敖汉等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供做网站、成都网站制作 网站设计制作按需求定制设计,公司网站建设,企业网站建设,品牌网站建设,营销型网站建设,成都外贸网站建设公司,敖汉网站建设费用合理。

test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 还能做到。可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能。

[[ ]] 的用法为:

[[ expression ]]

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

[[ ]] 不需要注意某些细枝末节

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

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

请看下面的演示代码:

#!/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

运行结果:

http://c.biancheng.net/shell/

http://data.biancheng.net/

str1 < str2

[[ ]] 支持逻辑运算符

对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个 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 ]]

str 表示字符串,regex 表示正则表达式。

下面的代码检测一个字符串是否是手机号:

#!/bin/bash

read tel

if [[ $tel =~ ^1[0-9]{10}$ ]]
then
    echo "你输入的是手机号码"
else
    echo "你输入的不是手机号码"
fi

运行结果1:

13203451100

你输入的是手机号码

运行结果2:

132034511009

你输入的不是手机号码


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

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

本文并不打算讲解正则表达式的语法,不了解的读者请猛击《正则表达式30分钟入门教程》。

总结

有了 [[ ]],你还有什么理由使用 test 或者 [ ],[[ ]] 完全可以替代之,而且更加方便,更加强大。

但是 [[ ]] 对数字的比较仍然不友好,所以我建议,以后大家使用 if 判断条件时,用 (()) 来处理整型数字,用 [[ ]] 来处理字符串或者文件。

网页名称:Shell[[]]详解:检测某个条件是否成立
浏览地址:http://www.shufengxianlan.com/qtweb/news8/120908.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联