轉(zhuǎn)載自:https://www.2cto.com/os/201308/239136.html
$()和${}的用法:
在 bash shell 中壹瘟,$( ) 與 (反引號) 都是用來做命令替換用(command substitution)的。而 $( ) 并不見的每一種 shell 都能使用,若你用 bash2 的話混蔼,肯定沒問題...
看 ${ } 吧... 它其實就是用來作變量替換用的啦。一般情況下几苍,$var 與 ${var} 并沒有啥不一樣蚀浆。但是用 ${ } 會比較精確的界定變量名稱的范圍。
我這里再用一些例子加以說明 ${ } 的一些特異功能:
假設(shè)我們定義了一個變量為:
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 個字節(jié):/dir1
${file:5:5}:提取第 5 個字節(jié)右邊的連續(xù) 5 個字節(jié):/dir2
我們也可以對變量值里的字符串作替換:
${file/dir/path}:將第一個 dir 提換為 path:/
path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部 dir 提換為 path:/
path1/path2/path3/my.file.txt
利用 ${ } 還可針對不同的變量狀態(tài)賦值(沒設(shè)定合瓢、空值、非空值):
${file-my.file.txt} :假如 $file 沒有設(shè)定透典,則使用 my.file.txt 作傳回值晴楔。(空值及非空值時不作處理)
${file:-my.file.txt} :假如 $file 沒有設(shè)定或為空值,則使用my.file.txt 作傳回值峭咒。 (非空值時不作處理)
${file+my.file.txt} :假如 $file 設(shè)為空值或非空值税弃,均使用my.file.txt作傳回值。(沒設(shè)定時不作處理)
${file:+my.file.txt} :若 $file 為非空值凑队,則使用 my.file.txt 作傳回值则果。(沒設(shè)定及空值時不作處理)
${file=my.file.txt} :若 $file 沒設(shè)定,則使用 my.file.txt 作傳回值漩氨,同時將 $file 賦值為 my.file.txt 西壮。 (空值及非空值時不作處理)
${file:=my.file.txt} :若$file沒設(shè)定或為空值,則使用my.file.txt作傳回值叫惊,同時將 $file 賦值為my.file.txt 茸时。(非空值時不作處理)
${file?my.file.txt} :若 $file 沒設(shè)定,則將 my.file.txt 輸出至STDERR赋访。 (空值及非空值時不作處理)
${file:?my.file.txt} :若 $file 沒設(shè)定或為空值可都,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)
以上的理解在于, 你一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態(tài).
一般而言, : 與 null 有關(guān), 若不帶 : 的話, null 不受影響, 若帶 : 則連null 也受影響.
還有哦蚓耽,${#var} 可計算出變量值的長度:
${#file} 可得到 27 渠牲,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個字節(jié)...
$(())的用途:
它是用來作整數(shù)運算的。
在 bash 中步悠,$(( )) 的整數(shù)運算符號大致有這些:
- / :分別為 "加签杈、減、乘、除"答姥。
% :余數(shù)運算
& | ^ !:分別為 "AND铣除、OR、XOR鹦付、NOT" 運算尚粘。
舉例:
wangnc>a=5;b=7;c=2;
wangnc>echo $a + $b
5 + 7
wangnc>echo $(( a + b*c))
19
wangnc>echo $(((a*b)/c))
17
wangnc>echo $(($a +$b*$c))
19
wangnc>
在 $(( )) 中的變量名稱,可于其前面加 $ 符號來替換敲长,也可以不用郎嫁,如:
$(( $a + $b * $c)) 也可得到 19 的結(jié)果
此外,$(( )) 還可作不同進位(如二進制祈噪、八進位泽铛、十六進制)作運算呢,只是辑鲤,輸出結(jié)果皆為十進制而已:
echo $((16#2a)) 結(jié)果為 42 (16進位轉(zhuǎn)十進制)
(())的用途:
事實上盔腔,單純用 (( )) 也可重定義變量值,或作 testing:
a=5; ((a++)) 可將 $a 重定義為 6
a=5; ((a--)) 則為 a=4
a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值月褥。
常見的用于 (( )) 的測試符號有如下這些:
<:小于 >:大于
<=:小于或等于 >=:大于或等于
==:等于
!=:不等于