文章目录
- 区别一
- 区别二:<和>在[[ ]]中用作排序,而[ ]不支持
- 区别三:[ ]中使用-a和-o表示逻辑与和逻辑或,[[ ]]使用&&和||来表示
- 区别四:在[ ]中==是字符匹配,在[[ ]]中是模式匹配
- 区别五:[ ]不支持正则匹配,[[ ]]支持用=~进行正则匹配
- 区别六:[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持
- 区别七:[ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要
- 遇到的坑
- `1、[[ ! -f hosts ]]条件判断导致脚本退出`
- 原因
- 解决
区别一
[ ]是符合POSIX标准的测试语句,兼容性更强,几乎可以运行在所有的Shell解释器中
[[ ]]仅可运行在特定的几个Shell解释器中(如Bash等)
区别二:<和>在[[ ]]中用作排序,而[ ]不支持
进行比较前先设置LANG=C,在排序时使用ASCII码顺序
数字的ASCII码应该小于大写字母,使用[[ ]]的结果是正确的
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CN2IjN1gzYwYmYkRGMhFmYyYzX1ADNzQTM4IzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
区别三:[ ]中使用-a和-o表示逻辑与和逻辑或,[[ ]]使用&&和||来表示
[[ ]]不支持-a
区别四:在[ ]中==是字符匹配,在[[ ]]中是模式匹配
[[ ]]中表示变量name是否以字母d开头
区别五:[ ]不支持正则匹配,[[ ]]支持用=~进行正则匹配
[[ ]]判断变量name的值是否包含字母c
区别六:[ ]仅在部分Shell中支持用()进行分组,[[ ]]均支持
[ 1 == 1 -a (2 == 2 -o 3 == 4) ] && echo Y || echo N
[[ 1 == 1 && (2 == 2 || 3 == 4) ]] && echo Y || echo N #[[]]不支持-a和-o
区别七:[ ]中如果变量没有定义,那么需用双引号引起来,[[ ]]中不需要
参考书籍:《Linux Shell核心编程指南》
遇到的坑
1、[[ ! -f hosts ]]条件判断导致脚本退出
1、[[ ! -f hosts ]]条件判断导致脚本退出
[[ ! -f hosts ]] && echo "ERROR:hosts Not Found" && exit 1
echo $?
1
原因
解决
[[ ! -f hosts ]] && echo "ERROR:hosts Not Found" && exit 1
echo "INFO:Check_Env Is Ok"