Shell [[]]
1、定义
[[ ]]
是 Shell
内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。
[[ ]]
的用法为:
[[ expression ]]
当 [[ ]]
判断 expression
成立时,退出状态为 0
,否则为非 0
值。注意[[ ]]
和expression
之间的空格
,这两个空格是必须的,否则会导致语法错误。
2、部分优势
[[ ]]
是 Shell 内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了,具体包括:
- 不需要把变量名用双引号
""
包围起来,即使变量是空值,也不会出错。 - 不需要、也不能对
>、<
进行转义,转义后会出错。 - 大家使用
if 判断
条件时,用(())
来处理整型数字,用[[ ]]
来处理字符串或者文件
实例:
#!/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
3、简单实用
3.1、支持逻辑运算符
1、对多个表达式进行逻辑运算时,可以使用逻辑运算符将多个 test
命令连接起来,例如:
[ -z "$str1" ] || [ -z "$str2" ]
也可以借助选项把多个表达式写在一个 test 命令中,例如:
[ -z "$str1" -o -z "$str2" ]
这两种写法都有点“别扭”,完美的写法是在一个命令中使用逻辑运算符将多个表达式连接起来。我们的这个愿望在 [[ ]] 中实现了,[[ ]] 支持 &&、|| 和 ! 三种逻辑运算符。
使用 [[ ]]
对上面的语句进行改进:
[[ -z $str1 || -z $str2 ]]
[[ ]]
剔除了 test 命令的-o和-a选项
,你只能使用 ||
和 &&
。这意味着,你不能写成下面的形式:
[[ -z $str1 -o -z $str2 ]]
将多个 [[ ]]
连接起来依然是可以的
[[ -z $str1 ]] || [[ -z $str2 ]]
3.2、支持正则表达式
使用=~
来检测字符串是否符合某个正则表达式
[[ 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}
匹配连续的十个数字;$
匹配字符串的末尾(一个位置)。