$(())与$()还有${}的差别

在bash shell中,$()与``(反引号)都是用来做命令替换(command substitution)的。

*完成引号里的命令行,然后将其结果替换出阿里,再重组命令行。

例如:

$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)

${}会比较精确的界定变量名称的范围。${}的一些特异功能如下例说明。

例:

假设定义一个变量为:

file=/dir1/dir2/dir3/my.file.txt

我们可以用${}分别替换获得不同值

${file#*/}:拿掉第一条/及其左边的字串:dir1/dir2/dir3/my.file.txt

${file##*/}:拿掉最后一条/及其左边的字串:my.file.txt

${file#*.}:拿掉第一个.及其左边的字串:file.txt

${file##*.}:拿掉最后一个.及其左边的字串:txt

${file%/*}:拿掉最后一条/及其右边的字串:/dir1/dir2/dir3

${file%%/*}:拿掉第一条/及其右边的字串:(空值)

${file%.*}:拿掉最后一个.及其右边的字串:/dir1/dir2/dir3/my.file

${file%%.*}:拿掉第一个.及其右边的字串:/dir1/dir2/dir3/my

记忆的方法为:

#是去掉左边(在键盘上#在$的左边)

%是去掉右边(在键盘上%在$的右边)

单一符号是最小匹配;两给符号是最大匹配。


${file:0:5}:提取最左边的5个字节:/dir1

${file:5:5}:提取第5个字节右边的连续5个字节:/dir2


我们一颗一对变量值里的字串作替换:

${file/dir/path}:将第一个dir替换为path:/path1/dir2/dir3/my.file.txt

${file//dir/path}:将全部dir替换为path:/path1/path2/path3/my.file.txt


利用${}还可以针对不同的变数状态复制(没设定、空值、非空值、):
${file-my.file.txt}:假如$file没有设定,则使用my.file.txt作传回值。(空值及非空值时不作处理)

${file:-my.file.txt}:假如$file没有设定或为空值,则使用my.file.txt作传回值。(非空值不作处理)

${file+my.file.txt}:假如$file为空值或非空值,均使用my.file.txt作传回值。(没设定时不作处理)

${file:+my.file.txt}:若$file为非空值,则使用my.file.txt作传回值。(没设定及空值时不作处理)

${file=my.file.txt}:若$file没设定,则使用my.file.txt作传回值,同时将$file赋值为my.file.txt。(空值及非空值时不作处理)

${file:=my.file.txt}:若$file没设定或为空值,则使用my.file.txt作传回值,同时将$file赋值为my.file.txt。(非空值时不作处理)

${file?my.file.txt}:若$file没设定,则将my.file.txt输出至STDERR。(空值及非空值不作处理)

${file:?my.file.txt}:若$file没设定或为空值,则将my.file.txt输出至STDERR。(非空值时不作处理)


以上的理解:一般而言,:与null有关,若不带:的话,null不受影响,若带:则连null也受影响。


${#var}:可计算出变量值的长度:

${#file}:可得到27,以为/dir1/dir2/dir3/my.file.txt刚好是27个字节


bash中的数组(array)的处理方法。

一般而言,A="a b c def"这样的变量知识将$A替换为一个单一的字串,

但是改为A=(a b c def),则是将$A定义为数组...

bash的数组替换方法可参考如下方法:

${A[@]} 或 ${A[*]}

可得到a b c def(全部元素)

${A[0]}

可得到a(第一个元素),${A[1]}则为第二个元素

${#A[@]}或${#A[*]}

可得到4(全部元素数量)

${#A[0]}

可得到1(即第一个元素(a)的长度),${#A[3]}可得到3(第四个元素(def)的长度)

A[3]=xyz

则是将第四个元素重新定义为xyz


$(())的用途:它是用来作整数运算的。

在bash中,$(())的整数原酸符号大致有如下这些:

+ - * /:分别为“加、减、乘、除“。

%:余数运算

& | ^ ! :分别为“AND、OR、XOR、NOT”运算。

$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1

在$(())中的变量名称,可在其前面加$符号來替换,也可以不用,如:

$(($a + $b * $c))也可得到19的结果

注:在$(())中,变量与运算符号之间是否有空格都是合法的。


此外,$(())还可以作不同进位(如二进制、八进制、十六进制)作运算,只是输出结果皆为十进制。

echo $((16#2a))结果为42(十六进制转为十进制)

例:假如当前的umask是022,那么新建文件的权限即为:

$ umask 022
$ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644

事实上,单纯用(())也可以重定义变量值,或作testing:

a=5;((a++))可将$a重定义为6

a=5;((a--))则为a=4

a=5;b=7;((a<b))会得到0(true)的返回值

常见的用于(())的测试符号有如下这些:

<:小于

>:大于

<=:小于或等于

>=:大于或等于

==:等于

!=:不等于


注使用(())作整数测试时,不要跟[]的整数测试搞混乱了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值