小括号()和大括号{}

主要包括一下几种


  • ${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)  {}第一个指令和左括号需要有空格,()不需要

下面是一个简单的例子  

[java] view plaincopy

  1. "font-size:10px;">$ var=test   

  2. $ (var=notest; echo $var) ###变量var值为notest,此是在子shell中有效   

  3. notest   

  4. $ echo $var ###父shell中值仍为test   

  5. test   

  6. $ { var=notest; echo $var;} ###注意左括号和var之间要有一个空格   

  7. notest   

  8. $ echo $var ###父shell中的var变量的值变为了notest   

  9. notest   

  10. $ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###输出test1被重定向到文件a中,   

  11. test2 ###而test2输出则仍输出到标准输出中。   

  12. $ cat a   

  13. test1   

  14. $ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内命令的标准输出全部被重定向到文件a中   

  15. $ cat a   

  16. test1   

  17. test2  


4.$((expr))用于执行数学运算,语法类似c语言

   例子如下


[java] view plaincopy

  1. "font-size:10px;">$ echo $((3+2))   

  2. 5   

  3. $ echo $((3>2))   

  4. 1   

  5. $ echo $((25<3 ? 2:3))   

  6. 3   

  7. $ echo $var  

  8.   

  9. $ echo $((var=2+3))   

  10. 5   

  11. $ echo $var   

  12. 5   

  13. $ echo $((var++))   

  14. 5   

  15. $ echo $var   

  16. 6   

  17. $  


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  [[  ]] 双方括号

 

基本要素:

  ` ` 两个符号左右都要有空格分隔

  内部操作符与操作变量之间要有空格:如  [[  “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把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

       

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

参考内容

小括号部分转自:http://my.oschina.net/xiangxw/blog/11407

中括号部分转自:http://blog.csdn.net/hittata/article/details/8049665