bash 括号(小括号,双小括号,中括号,双中括号,大括号)
来源:互联网 发布:linux服务器书籍推荐 编辑:程序博客网 时间:2024/04/28 09:53
http://blog.csdn.net/claytonzeng/article/details/10267225
小括号()和大括号{}
主要包括一下几种
- ${var}
- $(cmd)
- ()和{}
- $((exp))
- ${var:-string},${var:+string},${var:=string},${var:?string}
- $(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)
1.shell变量应用原型 ${var}
2.变量替换$(cmd)与`cmd`类似
注意:$(cmd)只输出标准输出,如果命令执行错误,则无输出
3. 一串命令执行 ()和{},
二者都用于执行一串命令,指令之间用;分开,注意:括号内的数据重导向只影响括号内部的指令输入输出,不影响括号外部的指令
不同之处如下:
运行方式:
1)()重新开启一个shell运行命令,{}在当前shell运行
语法:
1)()最后一条指令不需要; , {}最后一条指令需要;
2) {}第一个指令和左括号需要有空格,()不需要
下面是一个简单的例子
$ var=test $ (var=notest; echo $var) ###变量var值为notest,此是在子shell中有效 notest $ echo $var ###父shell中值仍为test test $ { var=notest; echo $var;} ###注意左括号和var之间要有一个空格 notest $ echo $var ###父shell中的var变量的值变为了notest notest $ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###输出test1被重定向到文件a中, test2 ###而test2输出则仍输出到标准输出中。 $ cat a test1 $ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内命令的标准输出全部被重定向到文件a中 $ cat a test1 test2
4.$((expr))用于执行数学运算,语法类似c语言
例子如下
5. ${var: } ,${var%}用于变量的替换和匹配替换结构
替换:
${var:-string} 若var为空,${var:-string}值为string
${var:=string} 与${var:-string}功能类型,不过${var:=string} 将string值赋给var变量
${var:=string} 判断某个变量是否赋值,没有的话则给它赋上一个默认值
${var:+string}的替换规则和${var:=string}相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值
匹配:
${var%pattern}和${var%%pattern}表示从最右边(即结尾)匹配的
${var#pattern} 和${var##pattern}从最左边(即开头)匹配的
中括号[] [[]]
一. bash [ ] 单双括号
基本要素:
Ø [ ] 两个符号左右都要有空格分隔
Ø 内部操作符与操作变量之间要有空格:如 [ “a” = “b” ]
Ø 字符串比较中,> < 需要写成\> \< 进行转义
Ø [ ] 中字符串或者${}变量尽量使用"" 双引号扩住,避免值未定义引用而出错的好办法
Ø [ ] 中可以使用 –a –o 进行逻辑运算
Ø [ ] 是bash 内置命令:[ is a shell builtin
[ ] 实际上是bash 中 test 命令的简写。即所有的 [ expr ] 等于 test expr。
二. bash [[ ]] 双方括号
基本要素:
Ø [[ ]] 两个符号左右都要有空格分隔
Ø 内部操作符与操作变量之间要有空格:如 [[ “a” = “b” ]]
Ø 字符串比较中,可以直接使用 > < ,无需转义
Ø [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配,例如:如果*没有被双引号扩住,可以匹配所有字符
例如:
[root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"
ok
Ø [[] ] 内部可以使用 && || 进行逻辑运算
Ø [[ ]] 是bash keyword:[[ is a shell keyword
[[ ]] 其他用法都和[ ] 一样
Ø [[ ]] 和 [ ] 都可以和 ! 配合使用
优先级
! > && > ||
逻辑运算符 < 关系运算符
逻辑运算符 : ! && || -a -o
关系运算符 : < > \> \< == = != – eq –ne -gt -ge –lt -le
比较
[[]] 运算符只是[]运算符的扩充。 [[]] 能够支持<,>符号运算不需要转义符,[]中必须转义:\> \< 。
[[]]是以字符串比较大小。里面支持逻辑运算符:&& || ,不再使用-a -o 。
对 test 命令来说, 用 -eq 要进行数字比较,而你此时传入字符串,就报错了。
[[ expr ]] 是bash中真正的条件判断语句,其语法更符合编程习惯 (比如 &&, || 的用法),在 [[ ]] 中 故意传字符串给 -eq 不会报错,bash实现中直接把非整数的字符串直接转换成了 0 (你可以自行验证,在 [[ ]] 中的,任何需要整数,但是提供又是其它不能转换成整数的字符串,都变成了0)。 这应该是bash实现中的没有对 [[ ]] 中 -eq 操作符两边的内容进行检查导致的。 对于我们来说,没必要钻这些东西,我们应该保证自己代码中的需要用到整数的时候,总是提供整数。
-----------------------------------------------------------------------------
n [[ ]] 比[ ] 具备的优势
-----------------------------------------------------------------------------
①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
③使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。
使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。
- bash 括号(小括号,双小括号,中括号,双中括号,大括号)
- bash 括号(小括号,双小括号,中括号,双中括号,大括号)
- bash 括号(小括号,双小括号,中括号,双中括号,大括号)
- shell中的括号(小括号,大括号,中括号)
- shell中的括号(小括号,中括号,大括号)
- shell中的括号(小括号,中括号,大括号)
- shell中的括号(小括号,中括号,大括号)
- shell中的括号(小括号,中括号,大括号)
- shell中的括号(小括号,中括号,大括号)
- shell 小括号中括号大括号
- [shell] 小括号、中括号、大括号
- shell中的括号(小括号,中括号,大括号/花括号)
- bash中的小括号以及双中括号,双小括号详解
- JavaScript小括号、中括号、大括号的多义性
- JavaScript小括号、中括号、大括号的多义性
- JavaScript小括号、中括号、大括号的多义性
- 大括号,中括号,小括号匹配问题
- JavaScript小括号、中括号、大括号的多义性
- 破解手机辐射危害健康的流言
- android经验总结
- volatile关键字
- 结构体初始化
- 在java Spring基础上实现自定义异常处理框架教程
- bash 括号(小括号,双小括号,中括号,双中括号,大括号)
- Android下建立数据库
- 直接拿来用!最火的Android开源项目(完结篇)
- How do I create a time-series object with dates?
- Android预置的数据库模块,对SQLite的深入理解
- Cursor的简单说明
- vs2010+QT4.8.6开发环境搭建
- jQuery unload事件
- 算法竞赛_入门经典_刘汝佳__(2)