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) 的返回值。
常见的用于 (( )) 的测试符号有如下这些:
<:小于
>:大于
<=:小于或等于
>=:大于或等于
==:等于
!=:不等于