$(())與$()還有${}的差別


在bash shell中,$()與``(反引號)都是用來做命令替換(command substitution)的。

*完成引號里的命令行,然后將其結果替換出阿里,再重組命令行。

例如:

$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)

${}會比較精確的界定變量名稱的范圍。${}的一些特異功能如下例說明。

例:

假設定義一個變量為:

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

我們可以用${}分別替換獲得不同值

${file#*/}:拿掉第一條/及其左邊的字串:dir1/dir2/dir3/my.file.txt

${file##*/}:拿掉最后一條/及其左邊的字串:my.file.txt

${file#*.}:拿掉第一個.及其左邊的字串:file.txt

${file##*.}:拿掉最后一個.及其左邊的字串:txt

${file%/*}:拿掉最后一條/及其右邊的字串:/dir1/dir2/dir3

${file%%/*}:拿掉第一條/及其右邊的字串:(空值)

${file%.*}:拿掉最后一個.及其右邊的字串:/dir1/dir2/dir3/my.file

${file%%.*}:拿掉第一個.及其右邊的字串:/dir1/dir2/dir3/my

記憶的方法為:

#是去掉左邊(在鍵盤上#在$的左邊)

%是去掉右邊(在鍵盤上%在$的右邊)

單一符號是最小匹配;兩給符號是最大匹配。


${file:0:5}:提取最左邊的5個字節:/dir1

${file:5:5}:提取第5個字節右邊的連續5個字節:/dir2


我們一顆一對變量值里的字串作替換:

${file/dir/path}:將第一個dir替換為path:/path1/dir2/dir3/my.file.txt

${file//dir/path}:將全部dir替換為path:/path1/path2/path3/my.file.txt


利用${}還可以針對不同的變數狀態復制(沒設定、空值、非空值、):
${file-my.file.txt}:假如$file沒有設定,則使用my.file.txt作傳回值。(空值及非空值時不作處理)

${file:-my.file.txt}:假如$file沒有設定或為空值,則使用my.file.txt作傳回值。(非空值不作處理)

${file+my.file.txt}:假如$file為空值或非空值,均使用my.file.txt作傳回值。(沒設定時不作處理)

${file:+my.file.txt}:若$file為非空值,則使用my.file.txt作傳回值。(沒設定及空值時不作處理)

${file=my.file.txt}:若$file沒設定,則使用my.file.txt作傳回值,同時將$file賦值為my.file.txt。(空值及非空值時不作處理)

${file:=my.file.txt}:若$file沒設定或為空值,則使用my.file.txt作傳回值,同時將$file賦值為my.file.txt。(非空值時不作處理)

${file?my.file.txt}:若$file沒設定,則將my.file.txt輸出至STDERR。(空值及非空值不作處理)

${file:?my.file.txt}:若$file沒設定或為空值,則將my.file.txt輸出至STDERR。(非空值時不作處理)


以上的理解:一般而言,:與null有關,若不帶:的話,null不受影響,若帶:則連null也受影響。


${#var}:可計算出變量值的長度:

${#file}:可得到27,以為/dir1/dir2/dir3/my.file.txt剛好是27個字節


bash中的數組(array)的處理方法。

一般而言,A="a b c def"這樣的變量知識將$A替換為一個單一的字串,

但是改為A=(a b c def),則是將$A定義為數組...

bash的數組替換方法可參考如下方法:

${A[@]} 或 ${A[*]}

可得到a b c def(全部元素)

${A[0]}

可得到a(第一個元素),${A[1]}則為第二個元素

${#A[@]}或${#A[*]}

可得到4(全部元素數量)

${#A[0]}

可得到1(即第一個元素(a)的長度),${#A[3]}可得到3(第四個元素(def)的長度)

A[3]=xyz

則是將第四個元素重新定義為xyz


$(())的用途:它是用來作整數運算的。

在bash中,$(())的整數原酸符號大致有如下這些:

+ - * /:分別為“加、減、乘、除“。

%:余數運算

& | ^ ! :分別為“AND、OR、XOR、NOT”運算。

$ a=5; b=7; c=2
$ echo $(( a+b*c ))
19
$ echo $(( (a+b)/c ))
6
$ echo $(( (a*b)%c))
1

在$(())中的變量名稱,可在其前面加$符號來替換,也可以不用,如:

$(($a + $b * $c))也可得到19的結果

注:在$(())中,變量與運算符號之間是否有空格都是合法的。


此外,$(())還可以作不同進位(如二進制、八進制、十六進制)作運算,只是輸出結果皆為十進制。

echo $((16#2a))結果為42(十六進制轉為十進制)

例:假如當前的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)的返回值

常見的用於(())的測試符號有如下這些:

<:小於

>:大於

<=:小於或等於

>=:大於或等於

==:等於

!=:不等於


注使用(())作整數測試時,不要跟[]的整數測試搞混亂了。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com