Shell [[]]¶
[[]]是Shell内置关键字, 它和 Shell test命令 命令类似, 也用来检测某个条件是否成立.
test能做到的, [[]]也能做到, 而且做的更好; test做不到的, [[]]还能做到.
可以认为[[]]是test的升级版, 对细节做了优化, 并且扩展了一些功能.
[[]]的用法为:
[[ expression ]]
当[[]]判断expression成立时, 退出状态为0, 否则为非0值.
注意[[]]和expression之间的空格, 这两个空格是必须的, 否则会导致语法错误.
[[]]不需要注意某些细枝末节¶
[[]]是Shell内置关键字, 不是命令, 在使用时没有给函数传递参数的过程, 所以test命令的某些注意事项在[[]]中就不存在了, 具体包括:
- 不需要把变量名用双引号包围起来, 即使变量是空值, 也不会出错;
- 不需要, 也不能对
>/<进行转义, 转义后会出错.
Example:
#!/usr/bin/env 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选项, 只能使用&&和||.
当然, 使用逻辑运算符将多个[[]]连接起来依然是可以的, 因为这是Shell本身提供的功能, 跟[[]]或者test没有关系.
[[]]支持正则表达式¶
在Shell [[]]中, 可以使用=~来检测字符串是否符合某个正则表达式, 它的用法如下:
[[ str =~ regex ]]
str表示字符串, regrx表示正则表达式.
Example:
#!/usr/bin/env bash
# 检测一个字符串是否是手机号码
read tel
if [[ $tes =~ ^1[0-9]{10}$ ]]
then
echo "你输入的是手机号码"
else
echo " 你输入的不是手机号码"
fi
总结¶
有了[[]], 还有什么理由使用test或者[], [[]]完全可以替代之, 而且更加方便, 更加强大.
但是, [[]]对数字的比较仍然不太友好, 所以建议在使用if条件判断时, 用(())来处理整型数字, 用[[]]来处理字符串或者文件.