shell - [[ ]]

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

语法

当[[ ]]判断expr成立时,退出状态为0,否则为非0值。这也和shell if语句对应上(true为0,false为非0)

[[ expr ]]

注意事项

  1. [[ ]]和expr之间有两个空格,这两个空格是必须的,否则会导致语法错误
  2. [[ ]]对数字的比较仍然不友好,建议使用if判断条件时,用(())来处理整型数字,用[[ ]]来处理字符串或者文件

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

[[ ]]是shell内置关键字,不是命令,所以不需要注意某些细枝末节。具体包括:

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

read -p "input str 1: " str1
read -p "input str 2: " str2

if [[ -z $str1 || -z $str2 ]]       #不需要对变量名加双引号
then
    echo "str cannot be null"
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 ]]

[[ ]]支持正则表达式

在[[ ]]中,可以使用’=~'来检测字符串是否符合某个正则表达式

[[ str =~ regex ]]

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

#!/bin/bash

read -p "input a phone number: " tel

if [[ $tel =~ ^1[0-9]{10}$ ]]
then
    echo "it's a phone number"
else
    echo "it's not a phone number"
fi

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

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

[[ ]]用法总结

测试内容[ ][[ ]]
数字测试-eq -ne -lt -le -gt -ge同[ ]
文件测试-r -l -w -x -f -d -s -nt -ot等同[ ]
字符测试= != -n -z \> \<,不可以使用>=和<=同[ ],<和>不需要转义
逻辑测试-a -o !&& || !
数字运算不可以使用+ - * / %
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值