目的
shell腳本中各種條件的判斷,都需要對判定條件精準把控,而字符串在腳本中用的是最多的,怎樣準確的獲取你想要的字符串至關重要。本文詳細介紹了shell腳本中妙用字符串的替換和截取,讓你精準獲得你心中的那個她。
截斷
例子: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/<code>
記憶方法很簡單:
#表示去掉左邊, ##去掉最後一個
%表示去掉右邊, %%去掉第一個
提取
單一符號是最小匹配,兩個符號是最大匹配。
<code>#提取最左邊的 5 個字節${file:0:5/dir1${file:5:5}:提取第 5 個字節右邊的連續 5 個字節:/dir2/<code>
替換
<code>#將第一個 dir 提換為 path${file/dir/path}結果:/path1/dir2/dir3/my.file.txt#將全部 dir 提換為 path${file//dir/path}結果:/path1/path2/path3/my.file.txt/<code>
針對不同的變量狀態賦值(沒設定、空值、非空值):
<code>#若$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。(非空值時不作處理)${file:?my.file.txt}注意: ":+"的情況是不包含空值的.":-", ":="等只要有號就是包含空值(null)./<code>
變量的長度
<code>${#file}/<code>
數組運算
<code>A=(a b c def)${A[@]} 或 ${A[*]} #可得到 a b c def (全部組數)${A[0]} #可得到 a (第一個組數),${A[1]} 則為第二個組數...${#A[@]} 或 ${#A[*]} #可得到 4 (全部組數數量)${#A[0]} #可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度)/<code>
閱讀更多 豌豆多多追夢記 的文章