天天看點

Linux—shell中$(( ))、$( )、``與${ }的差別

在bash中,<code>$( )</code>與<code>` `</code>(反引号)都是用來作指令替換的。

指令替換與變量替換差不多,都是用來重組指令行的,先完成引号裡的指令行,然後将其結果替換出來,再重組成新的指令行。

exp 1

在操作上,這兩者都是達到相應的效果,但是建議使用<code>$( )</code>,理由如下:

``很容易與''搞混亂,尤其對初學者來說。

在多層次的複合替換中,``必須要額外的跳脫處理(反斜線),而$( )比較直覺。

最後,$( )的弊端是,并不是所有的類unix系統都支援這種方式,但反引号是肯定支援的。

exp 2

一般情況下,<code>$var</code>與<code>${var}</code>是沒有差別的,但是用${ }會比較精确的界定變量名稱的範圍

取路徑、檔案名、字尾

先指派一個變量為一個路徑,如下:

<code>file=/dir1/dir2/dir3/my.file.txt</code>

指令

解釋

結果

${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}

擷取變量長度

27

根據狀态為變量指派

備注

${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=txt}

若 $file 沒設定,則回傳 txt ,并将 $file 指派為 txt

${file:=txt}

若 $file 沒設定或空值,則回傳 txt ,将 $file 指派為txt

${file?my.file.txt}

若 $file 沒設定,則将 my.file.txt 輸出至 STDERR

${file:?my.file.txt}

若 $file沒設定或空值,則将my.file.txt輸出至STDERR

tips: 以上的了解在于, 你一定要厘清楚 unset 與 null 及 non-null 這三種指派狀态. 一般而言, : 與 null 有關, 若不帶 : 的話, null 不受影響, 若帶 : 則連 null 也受影響.

數組

${A[@]}

傳回數組全部元素

a b c def

${A[*]}

同上

${A[0]}

傳回數組第一個元素

a

${#A[@]}

傳回數組元素總個數

4

${#A[*]}

${#A[3]}

傳回第四個元素的長度,即def的長度

3

A[3]=xyz

則是将第四個組數重新定義為 xyz

bash中整數運算符号

符号

功能

+ - * /

分别為加、減、乘、除

%

餘數運算

&amp; | ^ !

分别為“AND、OR、XOR、NOT”

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

進制轉換

$(( ))可以将其他進制轉成十進制數顯示出來。用法如下:

<code>echo $((N#xx))</code>

其中,N為進制,xx為該進制下某個數值,指令執行後可以得到該進制數轉成十進制後的值。

(( ))重定義變量值

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