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

 更新时间:2023年01月12日 10:10:05   作者:富士康质检员张全蛋  
本文主要介绍了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[[]]检测某个条件是否成立的文章就介绍到这了,更多相关Shell[[]]检测条件成立内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Shell实现判断进程是否存在并重新启动脚本分享

    Shell实现判断进程是否存在并重新启动脚本分享

    这篇文章主要介绍了Shell实现判断进程是否存在并重新启动脚本分享,本文给出了两个实现脚本,分简洁版和详细版,需要的朋友可以参考下
    2014-09-09
  • 详解Linux中atime,mtime,ctime的使用场景

    详解Linux中atime,mtime,ctime的使用场景

    这篇文章主要介绍了Linux的三个时间atime,mtime,ctime详细说明与使用场景,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-10-10
  • 利用kernel提供的接口打印进程号(pid)

    利用kernel提供的接口打印进程号(pid)

    我们知道linux是模块化的内核。实现模块、利用kernel提供的接口,首先了解写模块的基本框架。下面的c文件就是最基本的框架,当然还有怎样添加一些符号变量,利用的module_param,没用上
    2013-11-11
  • Shell实现系统时间和BIOS时间同步校准脚本分享

    Shell实现系统时间和BIOS时间同步校准脚本分享

    这篇文章主要介绍了Shell实现系统时间和BIOS时间同步校准脚本分享,本文给出了多个时间同步服务器,然后用ntpdate轮询同步,需要的朋友可以参考下
    2014-10-10
  • Linux实现文件定期本地备份/异地备份/删除备份的脚本

    Linux实现文件定期本地备份/异地备份/删除备份的脚本

    数据备份的意义就在于,当受到网络攻击、入侵、电源故障或者操作失误等事故的发生后,可以完整、快速、简捷、可靠地恢复原有系统。本文为大家准备了文件定期本地备份/异地备份/删除备份的脚本,希望对你们有所帮助
    2022-10-10
  • Linux查看系统时间的详细方法总结

    Linux查看系统时间的详细方法总结

    系统时间是计算机硬件和软件运行的基础,在Linux系统中,查看系统时间是一项基本任务,本文将从多个方面介绍Linux查看系统时间的详细方法,需要的朋友可以参考下
    2023-09-09
  • Linux下的fdisk指令用法场景分析

    Linux下的fdisk指令用法场景分析

    在Linux系统中,对磁盘进行分区是管理和利用磁盘空间的重要任务之一,本篇将以通俗易懂的方式,详细介绍fdisk指令的前世今生、功能、用法和应用场景,帮助读者全面了解fdisk指令,并掌握其在磁盘管理和问题排查方面的应用,需要的朋友可以参考下
    2024-01-01
  • Linux禁止普通用户su至root的解决方法

    Linux禁止普通用户su至root的解决方法

    很多朋友不清楚linux如何禁止普通用户su到root,这里需要修改两个配置文件,具体详细配置大家通过本文了解下吧
    2017-08-08
  • linux服务器安全加固shell脚本代码

    linux服务器安全加固shell脚本代码

    有时候安装完服务器以后,需要一些安全设置,这段脚本就是为了安全加固所写,需要的朋友可以参考下
    2013-06-06
  • 解决VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题

    解决VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题

    下面小编就为大家带来一篇解决VirtualBox中Ubuntu 14.04屏幕分辨率不能设置的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论