【一通百通】Bash的单双括号建议:多用[[]], 少用[]

一. 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”  ]]

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

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

[[email protected]]# [[ "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 ]]

[[email protected] ~]# if [[ "a" == "a" && 2 -gt1 ]] ;then echo "ok" ;fi

ok

[[email protected] ~]# if [[ "a" == "a" ]] && [[2 -gt 1 ]] ;then echo "ok" ;fi

ok

[[email protected] ~]# if [[ "a" == "a" ]] || [[ 2 -gt 1]] ;then echo "ok" ;fi

ok

[[email protected] ~]# if [[ "a" == "a" ]] || [[ 2 -gt10 ]] ;then echo "ok" ;fi

ok

[[email protected] ~]# 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把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

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

时间: 2024-12-28 01:06:57

【一通百通】Bash的单双括号建议:多用[[]], 少用[]的相关文章

shell内置命令test单双括号的区别

1.单括号TEST命令要对变量进行单词分离,当变量值包含空白符时,要用引号将变量括起来:而双括号的TEST命令不会对变量进行单词分离. 以下情况分为变量为单个单词,含有空格的词组. [[email protected] yujia]# echo $name hello [[email protected] yujia]# [ $name = "hello" ] [[email protected] yujia]# echo $? 0 [[email protected] yujia]#

Bash中的单双引号作用

shell中的输入的字符分为纯字符和元字符(特殊意义的字符 meta) 元字符: IFS:由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space ). CR:由 <enter> 产生. =:设定变量. $:作变量或运算替换(请不要与 shell prompt 搞混了). >:重导向 stdout. <:重导向 stdin. |:命令管线. &:重导向 file descriptor ,或将命令置于背境执

json包含单双引号问题解决方案

原创作品  转载请注明出处 最近项目中  遇到需要JSON传数据  但是某个字段 里面可能含有 双引号和单引号  导致出现错误 为了方便 写了一个工具类,比较好用. 支持"链式编程" 分享给大家 360网盘下载地址:http://yunpan.cn/cjCrRZj9uc8hE  访问密码 79f3 效果DEMO: JsonQuotesUtil.js /** * 解决json传输数据时存在 同时存在单引号和双引号的问题 * * 思路: * 将 单双引号用不容易在字符串中出现的字符分别替换

Java map双括号初始化方式的问题

关于Java双括号的初始化凡是确实很方便,特别是在常量文件中,无可替代.如下所示: Map map = new HashMap() {  {  put("Name", "Unmi");  put("QQ", "1125535");  } }; 好处很明显就是一目了然.这里来罗列下此种方法的坏处,如果这个对象要串行化,可能会导致串行化失败. 1.此种方式是匿名内部类的声明方式(不懂的下文有详尽解释),所以引用中持有着外部类的引用

Keepalived单双主模型配置

Keepalived单双主模型配置 Keepalived单主配置实例: 一.安装keepalived包 [[email protected] ~]# hostnamectl set-hostname keepalived-1 [[email protected] ~]# yum install keepalived.x86_64 主配置文件:/etc/keepalived/keepalived.conf主程序文件:/usr/sbin/keepalived 二.进行配置主配置文件: 主keepal

书写优雅的shell脚本(五)- shell中(())双括号运算符

在使用shell的逻辑运算符"[]"使用时候,必须保证运算符与算数之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构语句,就是对shell中算数及赋值运算的扩展. 1.语法: ((表达式1,表达式2-)) 2.特点: (1)在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等. (2)在双括号结构中,所有变量可以不加入:"$"符号前缀. (3)双括号可以进行逻辑运算,四则运算 (4)双括号结

CSS实现悬浮出现双括号

<html> <head> <style> a { position: relative; display: inline-block; outline: none; text-decoration: none; color: #000; font-size: 32px; padding: 5px 10px; cursor:hand; } a:hover::before, a:hover::after { position: absolute; } a:hover::b

关于单双引号与数组冲突问题,解决方法

最近在写站群程序,想把配置都搞成文件存放起来.在开发过程中出现了单双引号与数组冲突的问题. 错误提示: Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING 给大家举个栗子: <?php $a['aaa'] = 'bbb'; echo "'$a['aaa']'"; ?> 解决方法:把中括号中的2个单引号

linux shell “(())” 双括号运算符使用

导读 在刚开始学习inux shell脚本编程时候,对于它的 四则运算以及逻辑运算.估计很多朋友都感觉比较难以接受.特变逻辑运算符"[]"使用时候,必须保证运算符与算数 之间有空格. 四则运算也只能借助:let,expr等命令完成. 今天讲的双括号"(())"结构语句,就是对shell中算数及赋值运算的扩展. 使用方法: 语法: ((表达式1,表达式2-)) 特点: 1.在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等. 2.在双括号结构中,所有变量