小括号的用法正则表达式
一、数组赋值shell
二、子Shell赋值express
在子shell中变量var值为lookback,可是在上级shell中就不是这个值,能够看出是在子shell中有效的赋值数组
三、命令集合结果重定向bash
四、$()的用法测试
$(cmd)命令替换 spa
五、(())的用法命令行
加强括号的用法, 经常使用于算术运算比较. 双括号中的变量能够不使用$符号前缀, 只要括号中的表达式符合C语言运算规则, 支持多个表达式用逗号分开.
好比能够直接使用for((i=0;i<5;i++)), 若是不使用双括号, 则为for i in `seq 0 4`或者for i in {0..4}.
再如能够直接使用if (($i<5)), 若是不使用双括号, 则为if [ $i -lt 5 ].code
中括号的使用字符串
一、单中括号
①bash 的内部命令,[和test是等同的。若是咱们不用绝对路径指明,一般咱们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数做为比较表达式或者做为文件测试,而且根据比较的结果来返回一个退出状态码。if/test结构中并非必须右中括号,可是新版的Bash中要求必须这样。
②Test和[]中可用的比较运算符只有==和!=,二者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。不管是字符串比较仍是整数比较都不支持大于号小于号(双小括号支持)。若是实在想用,对于字符串比较可使用转义形式,若是比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
③字符范围。用做正则表达式的一部分,描述一个匹配的字符范围。做为test用途的中括号内不能使用正则。
④在一个array 结构的上下文中,中括号用来引用数组中每一个元素的编号。
#!/bin/sh #shell中对变量的值添加单引号,爽引号和不添加的区别,对类型来讲是无关的,主要是单引号不 #对相关量进行替换,如$解释成变量引用用值替代,双引号则进行替代 A="$1" B="$2" echo "输入的原始值:A=$A,B=$B" #下面的比较只能用于整数格式的比较(不能是小数),不然出现 #integer expression expected的错误 echo "shell风格:" if [ $A -eq $B ];then echo "eq" fi if [ $A -ge $B ];then echo "ge" fi if [ $A -le $B ];then echo "le" fi if [ $A -ne $B ];then echo "ne" fi if [ $A -gt $B ];then echo "gt" fi if [ $A -lt $B ];then echo "lt" fi echo "c风格的比较" #下面的c风格也ok,但主要是须要双括号 if (($A == $B));then echo "==" fi if (($A >= $B));then echo ">=" fi if (($A <= $B));then echo "<=" fi if (($A != $B));then echo "!=" fi if (($A > $B));then echo ">" fi if (($A < $B));then echo "<" fi
二、双中括号
①[[是 bash 程序语言的关键字。并非一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间全部的字符都不会发生文件名扩展或者单词分割,可是会发生参数扩展和命令替换。
②支持字符串的模式匹配,使用=~操做符时甚至支持shell的正则表达式。字符串比较时能够把右边的做为一个模式,而不只仅是一个字符串,好比[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不须要引号。
③使用[[ ... ]]条件判断结构,而不是[ ... ],可以防止脚本中的许多逻辑错误。好比,&&、||、<和> 操做符可以正常存在于[[ ]]条件判断结构中,可是若是出如今[ ]结构中的话,会报错。
④bash把双中括号中的表达式看做一个单独的元素,并返回一个退出状态码。
大括号
一、${var}
Shell中变量的原形,当变量名和后面的内容都是变量命名所容许的内容时候这时候直接用$var是不行的得用{}把变量名括起来
二、${var:-string}
当变量var值为空时${var:-a}会把a做为值,当变量var值不为空时,${var:-a}会把var的值做为变量
三、${var:+string}
${var:+a}的替换规则和上面的相反,即当变量var的值不为空的时将值换成a,当变量var为空时则不替换或者说是替换成变量var的值,即空值。(由于变量var此时为空,因此这两种说法我认为是同样的)
四、${var:=string}
当变量var值为空时,${var:=a}会将其赋值为a,且变量var也被赋值是a了,若变量var不为空时,${var:=string}的值都是变量var的值。(很经常使用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。)
五、${var:?string}
若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。咱们可利用此特性来检查是否设置了变量的值。
六、${var%pattern}
{variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,若是是,就从命令行把variable中的内容去掉右边最短的匹配模式
七、${variable%%pattern}
${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,若是是,就从命令行把variable中的内容去掉右边最长的匹配模式
八、${variable#pattern}
${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,若是是,就从命令行把variable中的内容去掉左边最短的匹配模式
九、${variable##pattern}
${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,若是是,就从命令行把variable中的内容去掉左边最长的匹配模式