linux系列之易混知识点

$()、 ` ` 、 ${ }、$[]、$(()) 、(())、()、{}、$?、$*、$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

转载于:https://my.oschina.net/u/4010291/blog/3035985

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值