一、小括号,圆括号()
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?不等于