$()、 ` ` 、 ${ }、$[]、$(()) 、(())、()、{}、$?、$*、$n、$#、$@
- $()与 ` `
在 bash shell 中,$( ) 与` ` (反引号) 都是用来做命令替换用(commandsubstitution)的。
例如 version=$(uname -r)和version=`uname -r`都可以是version得到内核的版本号
各自的优缺点:
1. ` ` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。但反单引号容易打错或看错。
2. $()并不是所有shell都支持。
- $var 与${var}
${ }用于变量替换。一般情况下,$var 与${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围。比如
$ A=B
$ echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来
若使用 ${ } 就没问题了:$ echo ${A}B ---> BB
${var} 的数组使用
: 例 A=(a b c def)
命令 | 解释 | 结果 |
${A[@]} | 返回数组全部元素 | a b c def |
${A[*]} | 同上 | a b c def |
${A[0]} | 返回数组第一个元素 | a |
${#A[@]} | 返回数组元素总个数 | 4 |
${#A[*]} | 同上 | 4 |
${#A[3]} | 返回第四个元素的长度,即def的长度 | 3 |
A[3]=xyz | 则是将第四个组数重新定义为 xyz |
${}的替换使用:${var:-string},${var:+string},${var:=string},${var:?string}
1、${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
$ echo ${a:-1} #此时a没有定义,不会被赋值
1
$ echo $a
$ echo ${a:=1} #此时a没有定义,但会被赋值
$ echo $a
1
2、${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
3、${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
${}的模式替换使用:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
1、${variable%pattern},这种模式时,shell在variable中查找,看它是否以给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式
2、${variable%%pattern},这种模式时,shell在variable中查找,看它是否以给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
3、${variable#pattern} 这种模式时,shell在variable中查找,看它是否以给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
4、${variable##pattern} 这种模式时,shell在variable中查找,看它是否以给的模式pattern开始,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,*表示零个或多个任意字符,?表示仅与一个任意字符匹配,[...]表示匹配中括号里面的字符,[!...]表示不匹配中括号里面的字符。
字符串提取和替换 ${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
1、${var:num},这种模式时,shell在var中提取第num个字符到末尾的所有字符。若num为正数,从左边0处开始;若num为负数,从右边开始提取字串,但必须使用在冒号后面加空格或一个数字或整个num加上括号,如${var: -2}、${var:1-3}或${var:(-2)}。
2、${var:num1:num2},num1是位置,num2是长度。表示从$var字符串的第$num1个位置开始提取长度为$num2的子串。不能为负数。
3、${var/pattern/pattern}表示将var字符串的第一个匹配的pattern替换为另一个pattern。
4、${var//pattern/pattern}表示将var字符串中的所有能匹配的pattern替换为另一个pattern。
$ a="abcda"
$ echo ${a:2} #字符串下标从0开始
cda
$ echo ${a:2:2}
cd
$ echo ${a/a/aa}
aabcda
$ echo ${a//a/aa}
aabcdaa
- {}与()多条命令执行
1、单小括号,(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号。
2、单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。
{}花括号的其他使用
1、touch {a,c}.txt 生成a.txt,c.txt
2、touch {a..c}.txt 生成a.txt,b.txt,c.txt
- $[]与$(())
它们是一样的,都是进行数学运算的。支持+ - * / %:分别为 “加、减、乘、除、取模”。但是注意,bash只能作整数运算。
((表达式1,表达式2…))
1、在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用。
$ a=5;b=7;c=2
$ echo $((a+b*c))
19
$ echo $(($a+$b*$c))
19
2、$((N#xx)) 其中,N为进制,xx为该进制下某个数值,命令执行后可以得到该进制数转成十进制后的值。
$ echo $((2#110)) # 二进制转十进制
6
$ echo $((16#2a)) # 十六进制转十进制
42
$ echo $((8#11)) # 八进制转十进制
9
3、(())重定义变量值,支持多个表达式运算,各个表达式之间用“,”分开
$ a=5;b=7
$ ((a++));echo $a
6
$ ((a--,b--));echo $a,$b
5,6
4、双括号结构 扩展了for,while,if条件测试运算,如for((i=0;i<5;i++))
- $?、$*、$n、$#、$@
函数
$? 返回上一行方法的返回值,获取函数返回值的方法
$n 取方法的第n个参数
${n} 取方法的第n个参数
$* 取全部参数
$@ 取全部参数
$# 取参数个数
传参的函数调用 fun n1,n2,n3