首頁  >  文章  >  系統教程  >  bash shell 中如何區分 $()和${}和$(())和(())

bash shell 中如何區分 $()和${}和$(())和(())

王林
王林轉載
2024-02-15 10:40:25931瀏覽

bash shell 中如何区别 $()和${}和$(())和(())

$()和${}的用法:

#在 bash shell 中,$( ) 與 ` ` (反引號) 都是用來做指令取代用(command substitution)的。而 $( ) 不見的每一種 shell 都能使用,若你用 bash2 的話,一定沒問題...

看 ${ } 吧... 它其實就是用來做變數替換用的啦。一般情況下,$var 與 ${var} 並沒有啥不一樣。但是用 ${ } 會比較精確的界定變數名稱的範圍。

我這裡再用一些範例來說明 ${ } 的一些特異功能:

假設我們定義了一個變數為:

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。 (非空值時不作處理)

以上的理解在於, 你一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態.

一般而言, : 與 null 有關, 若不帶 : 的話, null 不受影響, 若帶 : 則連null 也受影響.

還有哦,${#var} 可計算變數值的長度:

${#file} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個位元組...

$(())的用途:

它是用來作整數運算的。

在 bash 中,$(( )) 的整數運算符號大致上有這些:

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

% :餘數運算

& | ^ !:分別為 "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 的結果

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

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

(())的用途:

事實上,單純用 (( )) 也可重定義變數值,或作 testing:

a=5; ((a )) 可將 $a 重新定義為 6

a=5; ((a--)) 則為 a=4

a=5; b=7; ((a < b)) 會得到 0 (true) 的回傳值。

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

<:小於 >:大於

<=:小於或等於 >=:大於或等於

==:等於

!=:不等於

以上是bash shell 中如何區分 $()和${}和$(())和(())的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:linuxprobe.com。如有侵權,請聯絡admin@php.cn刪除