shell 中$()、${}、$(())

1、$()

    $()月``都是用作替换命令的。在bash2中,两者的作用完全等价。但是$()是``使用更加方便(存在嵌套使用该命令的时候),因为$()不用转义,而且内部的``却需要转义,请看使用``的情况

lhj@lhj-virtual-machine:~$ echo `ll `pwd`/test.sh`
bash: /test.sh: 没有那个文件或目录
lhj@lhj-virtual-machine:~$ echo `ll \`pwd\`/test.sh`
-rwxrw-r-- 1 lhj lhj 31 5月 3 00:29 /home/lhj/test.sh

    使用$()的情况

lhj@lhj-virtual-machine:~$ echo $(ll $(pwd)/test.sh)
-rwxrw-r-- 1 lhj lhj 31 5月 3 00:29 /home/lhj/test.sh

    ··可以在所用的unix shell中使用。而$()只能在bash2中使用,所以使用$()写出的shell比用``写出的可移植行查

2、${}

    $var与${var}基本上没有区别,但是${}会比较更精确界定变量的范围,例如

    

lhj@lhj-virtual-machine:~$ A=B
lhj@lhj-virtual-machine:~$ echo $AB

lhj@lhj-virtual-machine:~$ echo ${A}B
BB

    当然,${}不止存在这个优势

    使用${}或者变量不通的值,定义

    

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

    我们输入${file#/*},结果为

lhj@lhj-virtual-machine:~$ echo ${file#*/}
dir1/dir2/dir3/my.file.txt

    结果是去掉第一个“/”以及其左边后所获得的值,接着看${file##*/}

lhj@lhj-virtual-machine:~$ echo ${file##*/}
my.file.txt

    结果是去掉最后一个"/"及其左边后所获的值,接着再看${file%*}

lhj@lhj-virtual-machine:~$ echo ${file%/*}
/dir1/dir2/dir3

    结果是去掉最后一个"/"及其右边后所获的值,最后看${file%%/*}

lhj@lhj-virtual-machine:~$ echo ${file%%/*}

    结果是去掉第一个"/"及其右边后所获的值。

    ${}的功能还不止体现在上面的两个功能,它也能进行变量的替换,请看${file/dir/path}和${file//dir/path}命令

lhj@lhj-virtual-machine:~$ echo ${file/dir/path}
/path1/dir2/dir3/my.file.txt
lhj@lhj-virtual-machine:~$ echo ${file//dir/paht}
/paht1/paht2/paht3/my.file.txt

3、$(()) ,它是用作整数运算的。

在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * $c)) 也可得到 19 的结果

此外,$(( )) 还可作不同进位(如二进制、八进位、十六进制)作运算呢,只是,输出结果皆为十进制而已:
echo $((16#2a)) 结果为 42 (16进位转十进制)
以一个实用的例子来看看吧:
假如当前的   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) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于


你可能感兴趣的:(shell 中$()、${}、$(()))