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=Blhj@lhj-virtual-machine:~$ echo $ABlhj@lhj-virtual-machine:~$ echo ${A}BBB
当然,${}不止存在这个优势
使用${}或者变量不通的值,定义
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.txtlhj@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)) ))" | bc644事实上,单纯用 (( )) 也可重定义变量值,或作 testing:
a=5; ((a++)) 可将 $a 重定义为 6 a=5; ((a–)) 则为 a=4a=5; b=7; ((a < b)) 会得到 0 (true) 的返回值。常见的用于 (( )) 的测试符号有如下这些:<:小于>:大于<=:小于或等于>=:大于或等于==:等于!=:不等于