0.[[]] [] (())的对比
[[ ]] 对数字的比较不友好,所以使用 if 判断条件时,建议用(())来处理整型数字,用[[]]来处理字符串或者文件。
| 用法 | 说明 | 脚本 | 支持逻辑运算符 |
(()) |
((expression))
不需要注意空格
|
- 在 (( )) 中使用变量可以加也可以不加
$ 前缀,(( )) 会自动解析变量名
- 只用于进行整数运算
- 可以使用<、<=、>、>=等进行整数运算
- 表达式可以只有一个,也可以有多个,多个表达式之间以逗号
, 分隔
- 对于多个表达式的情况,以最后一个表达式的值作为整个 (( )) 命令的执行结果。
- 支持逻辑运算符,逻辑运算符为&& ||
|
|
((a>7 && b==c)) |
test/[] |
test expression
或[ expression ]
注意空格
|
- Shell 内置命令
- >、<、== 只能用来比较字符串
- 比较数字需要使用 -eq、-gt 等选项;
- 不管是比较字符串还是数字,test 都不支持 >= 和 <=。
- 变量名建议用双引号
"" 包围起来
- 比较字符串时需要对 >、< 进行转义
- 支持逻辑运算符,逻辑运算符为-o -a
|
- [ -z "$str1" ]||[ -z "$str2" ]#建议对变量名加双引号
- [[ $str1 \< $str2 ]]
|
使用逻辑运算符
[ -z "$str1" ] || [ -z "$str2" ]
|
√ |
使用-o -a !选项
[ -z "$str1" -o -z "$str2" ]
|
√ |
[ -z "$str1" || -z "$str2" ] |
× |
|
[[]]
[[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能
|
[[ expression ]]
注意空格
|
- Shell 内置关键字,不是命令,在使用时没有给函数传递参数的过程,所以 test 命令的某些注意事项在 [[ ]] 中就不存在了
- >、<、== 只能用来比较字符串
- 比较数字需要使用 -eq、-gt 等选项;
- 不需要把变量名用双引号
"" 包围起来,即使变量是空值,也不会出错。
- 不需要、也不能对 >、< 进行转义,转义后会出错。
- 支持正则表达式!!
- 支持逻辑运算符,逻辑运算符为&& ||
|
- [[ -z $str1 ]] || [[ -z $str2 ]]
|
[[ ]] 剔除了 test 命令的-o 和-a 选项,你只能使用 || 和 &&
使用逻辑运算符
[[ -z $str1 ]]||[[ -z $str2 ]]
|
√ |
[[ -z $str1 -o -z $str2 ]] |
× |
使用逻辑运算符
[[ -z $str1 || -z $str2 ]]
|
√ |
|
1.[[]]支持正则表达式
在 Shell [[ ]] 中,可以使用=~
来检测字符串是否符合某个正则表达式,它的用法为:
[[ str =~ regex ]] 其中,str 表示字符串,regex 表示正则表达式。
功能 | 脚本 | 结果 | 说明 |
检测一个字符串是否是手机号 |
- 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分钟入门教程》 |