在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中整數運算符号
符号
功能
+ - * /
分别為加、減、乘、除
%
餘數運算
& | ^ !
分别為“AND、OR、XOR、NOT”
在 $(( )) 中的變量名稱,可于其前面加 $ 符号來替換,也可以不用。
進制轉換
$(( ))可以将其他進制轉成十進制數顯示出來。用法如下:
<code>echo $((N#xx))</code>
其中,N為進制,xx為該進制下某個數值,指令執行後可以得到該進制數轉成十進制後的值。
(( ))重定義變量值
使用(( ))作整數測試時,不要跟[ ]的整數測試搞混亂了。