shell ${}的用法
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
記憶方法爲:
#是去掉左邊的字符;在鍵盤上#是在$之左邊
%是去掉右邊的字符;在鍵盤上%是在$之左邊
單一符號是最小匹配,兩個符號是最大匹配
PS: ${file#/} (不加*號)表示只去掉最左邊的一個"/"
上邊的語法不僅可以處理 "/" 和".",可以處理任何字符。
${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 也受影響。
計算變量的長度
${#file} 可得到27
數組的處理方法
A = "a b c def",這樣的變量是將$A替換成一個單一的字符串
A=(a b c def),則是將$A定義爲數組
bash的數組替換方法可參考如下:
${A[@]} 或者 ${A[*]} 可得到 a b c def
${A[0]} 可得到a(第一個元素),${A[1]} 則爲第二個元素
${#A[@]}或者${#A[*]} 可得到4(所包含的元素個數)
${#A[0]} 可得到1(即第一個元素(a)的長度),
A[3]=xyz 則是將第四個元素重新定義爲 xyz