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

一、$()
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) 的返回值。常見的用於 (( )) 的測試符號有以下這些:<:小於>:大於<=:小於或等於>=:大於或等於==:等於!=:不等於

相關文章
相關標籤/搜索