1 #!/bin/bash 2 # 双中括号 3 4 # 判断file1和file2文件是否同时存在. 5 # && 的作用是左边为真(返回码为0),才执行右边的命令. 6 # 下面用单中括号判断不正确,会提示少一个中括号. 7 ########################################## 8 if [ -f file1 && -f file2 ] 9 then 10 echo "file1 and file2 exist." 11 else 12 echo "file1 and file2 not exist." 13 fi 14 15 # 用单括号分开两个命令就正确了. 16 ########################################## 17 if [ -f file1 ] && [-f file2 ] 18 then 19 echo "file1 and file2 exist." 20 else 21 echo "file1 and file2 not exist." 22 fi
使用举例
if [[ (1 == $#) && ("hello" == $1) ]]; then echo "hello" fi
[] 和 [[]] 的区别(部分):
1.
- 单中括号
[ 2 -gt 1 -a 2 -lt 3 ]
或者
[ ( 2 -gt 1 ) -a ( 2 -lt 3 ) ]
注意:[右边和]左边的空格, 注意()转义, 注意(的右边和)的左边空格.
- 双中括号
[[ 2 > 1 && 2 < 3 ]]
或者
[[ (2 > 1) && (2 < 3) ]]
2. 双中括号正则匹配
[[ "abc def c" == a[abc]* ?d* ]]
一. bash [ ] 单双括号
基本要素:
Ø [ ] 两个符号左右都要有空格分隔
Ø 内部操作符与操作变量之间要有空格:如 [ “a” = “b” ]
Ø 字符串比较中,> < 需要写成> < 进行转义
Ø [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,避免值未定义引用而出错的好办法
Ø [ ] 中可以使用 –a –o 进行逻辑运算
Ø [ ] 是bash 内置命令:[ is a shell builtin
二. bash [[ ]] 双方括号
基本要素:
Ø [[ ]] 两个符号左右都要有空格分隔
Ø 内部操作符与操作变量之间要有空格:如 [[ “a” = “b” ]]
Ø 字符串比较中,可以直接使用 > < 无需转义
Ø [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配
[root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"
ok
Ø [[] ] 内部可以使用 && || 进行逻辑运算
Ø [[ ]] 是bash keyword:[[ is a shell keyword
[[ ]] 其他用法都和[ ] 一样
Ø [[ ]] 和 [ ] 都可以和 ! 配合使用
优先级 ! > && > ||
逻辑运算符 < 关系运算符
逻辑运算符 : ! && || -a -o
关系运算符 : < > > < == = != – eq –ne -gt -ge –lt -le
-----------------------------------------------------------------------------
n [[ ]] 比[ ] 具备的优势
-----------------------------------------------------------------------------
①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
③使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。