一、小括号,圆括号()
1、单小括号 ()
有些shell不支持。如tcsh。
2、双小括号 (( ))
若是逻辑推断,表达式exp为真则为1,假则为0。
作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自己主动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
二、中括号,方括号[]
1、单中括号 []
不管是字符串比較还是整数比較都不支持大于号小于号。假设实在想用,对于字符串比較能够使用转义形式,假设比較"ab"和"bc":[ ab < bc ]。结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
2、双中括号[[ ]]
在[[和]]之间全部的字符都不会发生文件名称扩展或者单词切割,可是会发生參数扩展和命令替换。
字符串比較时能够把右边的作为一个模式,而不仅仅是一个字符串。比方[[ hello == hell? ]],结果为真。
[[ ]] 中匹配字符串或通配符。不需要引號。
样例:
- if ($i<5)
- if [ $i -lt 5 ]
- if [ $a -ne 1 -a $a != 2 ]
- if [ $a -ne 1] && [ $a != 2 ]
- if [[ $a != 1 && $a != 2 ]]
- for i in $(seq 0 4);do echo $i;done
- for i in `seq 0 4`;do echo $i;done
- for ((i=0;i<5;i++));do echo $i;done
- for i in {0..4};do echo $i;done
三、大括号、花括号 {}
1、常规使用方法
- # ls {ex1,ex2}.sh
- ex1.sh ex2.sh
- # ls {ex{1..3},ex4}.sh
- ex1.sh ex2.sh ex3.sh ex4.sh
- # ls {ex[1-3],ex4}.sh
- ex1.sh ex2.sh ex3.sh ex4.sh
与小括号里的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。
{}的第一个命令和左括号之间必需要有一个空格。
2、几种特殊的替换结构
${var:-string},${var:+string},${var:=string},${var:?string}
② ${var:+string}的替换规则和上面的相反,即仅仅有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值。即空值。
(由于变量var此时为空。所以这两种说法是等价的)
③${var:?
string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空。则把string输出到标准错误中。并从脚本中退出。
我们可利用此特性来检查是否设置了变量的值。
补充扩展:在上面这五种替换结构中string不一定是常值的。可用另外一个变量的值或是一种命令的输出。
3、四种模式匹配替换结构
${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
第一种模式:${variable%pattern},这样的模式时,shell在variable中查找。看它是否一给的模式pattern结尾,假设是,就从命令行把variable中的内容去掉右边最短的匹配模式另外一种模式: ${variable%%pattern},这样的模式时,shell在variable中查找,看它是否一给的模式pattern结尾,假设是,就从命令行把variable中的内容去掉右边最长的匹配模式
第三种模式:${variable#pattern} 这样的模式时。shell在variable中查找,看它是否一给的模式pattern開始,假设是,就从命令行把variable中的内容去掉左边最短的匹配模式
第四种模式: ${variable##pattern} 这样的模式时。shell在variable中查找,看它是否一给的模式pattern结尾,假设是。就从命令行把variable中的内容去掉右边最长的匹配模式
这四种模式中都不会改变variable的值,当中,仅仅有在pattern中使用了*匹配符号时。%和%%,#和##才有差别。
结构中的pattern支持通配符,*表示零个或多个随意字符。?
表示仅与一个随意字符匹配。[...]表示匹配中括号里面的字符。[!...]表示不匹配中括号里面的字符
。- # var=testcase
- # echo $var
- testcase
- # echo ${var%s*e}
- testca
- # echo $var
- testcase
- # echo ${var%%s*e}
- te
- # echo ${var#?e}
- stcase
- # echo ${var##?e}
- stcase
- # echo ${var##*e}
- # echo ${var##*s}
- e
- # echo ${var##test}
- case
四、符号$后的括号
(1)${a} 变量a的值, 在不引起歧义的情况下能够省略大括号。
(2)$(cmd) 命令替换,和`cmd`效果同样。结果为shell命令cmd的输,过某些Shell版本号不支持$()形式的命令替换, 如tcsh。
(3)$((expression)) 和`exprexpression`效果同样, 计算数学表达式exp的数值, 当中exp仅仅要符合C语言的运算规则就可以, 甚至三目运算符和逻辑表达式都能够计算。
五、使用
1、多条命令运行
(1)单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序运行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后能够没有分号。
(2)单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序运行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对{}和()而言, 括号里的重定向符仅仅影响该条命令, 而括号外的重定向符影响到括号里的全部命令。
数字大小的比較为 -eq 等于。-gt 大于。-lt 小于;-le 小于等于;-ge 大于等于。-ne 不等于