一. bash [  ] 单双括号

基本要素:

Ø  [ ] 两个符号左右都要有空格分隔

Ø  内部操作符与操作变量之间要有空格:如  [  “a”  =  “b”  ]

Ø  字符串比较中,> < 需要写成\> \< 进行转义

Ø  [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,避免值未定义引用而出错的好办法

Ø  [ ] 中可以使用 –a –o 进行逻辑运算

Ø  [ ] 是bash 内置命令:[ is a shell builtin

1.测试时逻辑操作符

-a

逻辑与,操作符两边均为真,结果为真,否则为假。

-o

逻辑或,操作符两边一边为真,结果为真,否则为假。

!

逻辑否,条件为假,结果为真。

举例: [ -w result.txt-a -w score.txt ] ;echo $? // 测试两个文件是否均可写

2.常见字符串测试

string

断字符串是否为空,为空真0,非空假1

-z string

字符串string 为空串(长度为0)时返回真

-n string

字符串string 为非空串时返回真

str1  =  str2

字符串str1 和字符串str2 相等时返回真

str1  ==  str2

同 =

str1  !=  str2

字符串str1 和字符串str2 不相等时返回真

str1  \ <  str2

按字典顺序排序,字符串str1 在字符串str2 之前

str1  \>  str2

按字典顺序排序,字符串str1 在字符串str2 之后

3.常见数值测试

int1 -eq int2

如果int1 等于int2,则返回真

int1 -ne int2

如果int1 不等于int2,则返回真

int1 -lt int2

如果int1 小于int2,则返回真

int1 -le int2

如果int1 小于等于int2,则返回真

int1 -gt int2

如果int1 大于int2,则返回真

int1 -ge int2

如果int1 大于等于int2,则返回真

4.文件状态测试

-b filename

当filename 存在并且是块文件时返回真(返回0)

-c filename

当filename 存在并且是字符文件时返回真

-d pathname

当pathname 存在并且是一个目录时返回真

-e pathname

当由pathname 指定的文件或目录存在时返回真

-f filename

当filename 存在并且是正规文件时返回真

-g pathname

当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真

-h filename

当filename 存在并且是符号链接文件时返回真 (或 -L filename)

-k pathname

当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真

-p filename

当filename 存在并且是命名管道时返回真

-r pathname

当由pathname 指定的文件或目录存在并且可读时返回真

-s filename

当filename 存在并且文件大小大于0 时返回真

-S filename

当filename 存在并且是socket 时返回真

-t fd

当fd 是与终端设备相关联的文件描述符时返回真

-u pathname

当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真

-w pathname

当由pathname 指定的文件或目录存在并且可写时返回真

-x pathname

当由pathname 指定的文件或目录存在并且可执行时返回真

-O pathname

当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)

-G pathname

当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真

file1 -nt file2

file1 比file2 新时返回真

file1 -ot file2

file1 比file2 旧时返回真

f1 -ef f2

files f1 and f2 are hard links to the same file

二.   bash  [[  ]] 双方括号

基本要素:

Ø  [[ ]] 两个符号左右都要有空格分隔

Ø  内部操作符与操作变量之间要有空格:如  [[  “a” =  “b”  ]]

Ø  字符串比较中,可以直接使用 > < 无需转义

Ø  [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配

[root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"

  ok

Ø  [[] ] 内部可以使用 &&  || 进行逻辑运算

Ø  [[ ]] 是bash  keyword:[[ is a shell keyword

[[ ]] 其他用法都和[ ] 一样

二者共同特性:

Ø  && ||-a –o 处理

[  exp1  -a exp2  ] = [[  exp1 && exp2 ]] = [  exp1  ]&& [  exp2  ] = [[ exp1  ]] && [[  exp2 ]]

[  exp1  -o exp2  ] = [[  exp1 || exp2 ]] = [  exp1  ]|| [  exp2  ] = [[ exp1  ]] || [[  exp2 ]]

[root@localhost ~]# if [[ "a" == "a" && 2 -gt1 ]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a" ]] && [[2 -gt 1 ]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a" ]] || [[ 2 -gt 1]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a" ]] || [[ 2 -gt10 ]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a"  || 2 -gt 10 ]] ;then echo "ok" ;fi

ok

Ø  [[ ]] 和 [ ] 都可以和 ! 配合使用

优先级 !  >  && > || 

逻辑运算符  < 关系运算符

逻辑运算符  : !  &&  || -a  -o

关系运算符  : <  >  \> \<  ==  = !=  – eq –ne  -gt -ge  –lt  -le

 

-----------------------------------------------------------------------------

n  [[  ]] 比[ ] 具备的优势

-----------------------------------------------------------------------------

①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。

②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

③使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。

④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。

最新文章

  1. jQuery对象和DOM对象的区别
  2. SQLSERVER 获取datetime日期的查询语句
  3. sublime 编辑器配置和构建检查
  4. C#组合查询小Demo
  5. 导出DBF,并且提供下载 [转]
  6. [SQL Server]Index/deadlock
  7. SD卡驱动分析(一)
  8. RabbitMQ介绍4 - 编程(C#客户端示例)
  9. 微软职位内部推荐-SW Engineer II for Cloud Servi
  10. ubuntu 折腾之路
  11. spring junit 做单元测试,报 Failed to load ApplicationContext 错误
  12. XMPP适配IPV6 (GCDAsyncSocket适配IPV6)
  13. linux多线程socket编程一些心得
  14. Asp.net SignalR 初试和应用笔记一 认识和使用 SignalR
  15. BT渗透工具使用学习笔记
  16. Java Socket通信实现私聊、群聊
  17. 使用Python的Mock库进行PySpark单元测试
  18. About Gnu Linker1
  19. 我们一起踩过的坑----react(antd)(二)
  20. SOA和微服务架构的区别

热门文章

  1. LM**项目开发感悟
  2. Android群英传笔记——第六章:Android绘图机制与处理技巧
  3. 关于NSKeyedArchiver的编码格式
  4. 基于友善之臂ARM-tiny4412--uboot源码分析
  5. 对于CocoaPods的简单理解,实践安装使用过程和常见问题
  6. [Zabbix3.0 ]添加Nginx监控
  7. python字符串27种常见的方法
  8. 用eclipse怎样将本地的项目打成jar包上传到maven仓库
  9. FreeMarker系列学习笔记
  10. DELETE_FAILED_INTERNAL_ERROR Error while Installing APK