一、$()
shell
$()月``都是用做替換命令的。在bash2中,二者的做用徹底等價。可是$()是``使用更加方便(存在嵌套使用該命令的時候),由於$()不用轉義,並且內部的``卻須要轉義,請看使用``的狀況bash
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比用``寫出的可移植行查
unix
二、${}code
$var與${var}基本上沒有區別,可是${}會比較更精確界定變量的範圍,例如class
lhj@lhj-virtual-machine:~$ A=B lhj@lhj-virtual-machine:~$ echo $AB lhj@lhj-virtual-machine:~$ echo ${A}B BB
固然,${}不止存在這個優點
test
使用${}或者變量不通的值,定義
變量
file=/dir1/dir2/dir3/my.file.txt
咱們輸入${file#/*},結果爲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
三、$(()) ,它是用做整數運算的。
在 $(( )) 中的變量名稱,可於其前面加 $ 符號來替換,也能夠不用,如:
$(( $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=4a=5; b=7; ((a < b)) 會獲得 0 (true) 的返回值。常見的用於 (( )) 的測試符號有以下這些:<:小於>:大於<=:小於或等於>=:大於或等於==:等於!=:不等於