$( )
$( )在功能上和` `基本一样,都是先运行包含在其中的命令。区别在于两点:
1.` `嵌套时内层需要转义,如
command1 `command2 /`command3/` `
2.$( )兼容性相对差一点(bash和sh上完全可以使用)
${ }
1.${ }一般情况下就是取变量值,和$差不多。但前者可以精确界定变量名称的范围,这在添加变量内容时非常有用,如
A=B
echo $AB #报错,找不到名为AB的变量
这时应这样
A=B
echo ${A}B #结果为BB
也就是说${ }能将变量名与append的常量部分有效分隔开来
2.${ }的功能还不止于此,它还可以用作字符串处理,且${ }中可以用通配符:
- ${#str}:获得字符串长度
- ${str/substr/replacement}:将str中第一个substr替换为replacement
- ${str//substr/replacement}:将str中所有substr替换为replacement
- ${str:pos}:从索引pos开始提取substr(pos从0开始)
- ${str:pos:len}:从索引pos开始提取长度为len的substr
- ${str#substr}:删除第一个匹配的substr(左边)
- ${str##substr}:删除最后一个匹配的substr(左边)
- ${str%substr}, ${str%%substr}和#类似,不过是在右边
记忆方法:#去掉左边,%去掉右边,单符号是最小匹配,双符号是最大匹配
详见这里
3.${ }的第三个功能是针对不同变量状态进行赋值:
首先理解变量的三种状态:unset,null和non-null
- ${var-default}:若var为unset,则返回default,否则返回原值(注意这里指“返回”,即无论var什么状态,在这个过程中它并不会被赋值)(返回原值的意思是将表达式${var-default}看作${var})
- ${var+default}:若var为null或non-null,则返回default,否则返回原值(+和-形成互补)
- ${var=default}:若var为unset,则返回default,并将default赋给var,否则返回原值
- ${var?default}:若var为unset,则报错(报错信息为default),否则返回原值
相应的还有${var:-default}, ${var:+default}, ${var:=default}和${var:?default},区别在于带:则null受影响;不带:,则null不受影响
综上所述,${ }有三个功能:
- 精确界定变量名范围,用于append
- 字符串处理
- 根据变量状态进行赋值(这里注意=和其他符号的区别,=会在一定条件下将default赋给var,而其他符号不会,只是单纯地返回值)
$(( ))
1.$(( ))用于整数运算,如
a=2; b=7; c=9
echo $((a*b+c)) #结果为23
2.$(( ))中的变量名前不要求$
3.
勿将$(( ))和(( ))混淆,前者是得出整数运算结果,后者是数值测试条件,也用于变量自增减(常用于for和while),如(( var++ ))