限定變量。
如果壹個變量名A是另壹個變量名AB的前部分,那麽,如果要在AB相連時,要得到A的值,就必須使用${var}限定。
如果變量名不會產生歧義時(即獨立的變量名),${var}與$var沒有任何區別。
var="hello"
var_01="hello01"
echo? $var $var_01 ${var}_01
>>> hello hello01 hello_01
2、${#var}
得到變量var的長度
var="hello"
echo ${#var}
>>> 5
3、${var#}
刪除變量首部的字符(串),
"#"後面的可以是字面串,也可以是正則表達式(惰性匹配)。
var="hello"
echo ${var#he}
>>> llo
var="/res_pos/path/from/something"
echo ${var#/}
>>> res_pos/path/from/something # 刪除第壹個"/"
echo ${var#/*/}
>>> path/from/something? # 刪除首部匹配"/*/"的串,即"/res_pos/"
4、${var##}
刪除變量首部的字符(串),
只是,當使用2個"##"時,匹配是貪婪的(貪婪匹配,也就是盡可能多的匹配)。
echo ${var##/*/}
>>> something? # 刪除首部匹配"/*/"的串,即"/res_pos/path/from/"。
5、${var%}
刪除變量尾部的字符(串),
"%"後面的可以是字面串,也可以是正則表達式(惰性匹配)。
var="hello"
echo ${var%llo}
>>> he
var="~/res_pos/path/from/something"
echo ${var%/*}
>>> ~/res_pos/path/from # 刪除尾部的"/something"
6、${var%%}
刪除變量尾部的字符(串),
只是,當使用2個"%%"時,匹配是貪婪的(對應於第4條)
var="~/res_pos/path/from/something"
echo ${var%/*}
>>> ~ # 刪除第壹個的"/"後的所有所有內容(包括"/"),貪婪匹配中,"/*"就是"/"後的所有字符串
7、${var::}
跟python的切片概念相似,取變量var的起始索引,
指定長度的子串(${var:索引:長度})。
var="~/res_pos/path/from/something"
echo ${var:0:5}
>>> ~/res
echo ${var:1:5}
>>> /res_ ? # 可見,字符串的索引是從0開始的
echo ${var::5}
>>> ~/res ? # 省略"索引",默認為從0開始
echo ${var:1:}
>>> ? # 省略"長度",默認長度為0,所以輸出為空
8、${var//}
字符串替換。
將var中的字符串A替換成字符串B(${var/A/B})。
var="hello world"
echo ${var/hello/hi}
>>> hi world ? # 字符串"hello"替換成了"hi"
echo ${var/l/X}
>>> heXlo world? # 第壹個"l"替換成了"X"
9、${var///}
字符串替換,
與第8點相同,只不過,現在是將所有出現的串A替換成串B(${var//A/B})。
var="hello world"
echo ${var//l/X}
>>> heXXo worXd? # 所有的"l"都替換成了"X"
10、${var/#/}
替換字符串首部的串A為串B,
(${var/#A/B}),與第8點不同的是,這裏只替換首部的串A。
var="hello world. hello baby."
echo ${var//h/H}
>>> Hello world. Hello baby. # 將所有"h"替換成了"H"
echo ${var/#h/H}
>>> Hello world. hello baby. # 將首部的"h"替換成了"H"
echo ${var/e/E}
>>> hEllo world. hello baby. # 將第壹個出現的"e"替換成了"E"
echo ${var/#e/E}
>>> hello world. hello baby. # 首字符不是"e",所以沒有進行任何替換,原樣輸出。
11、${var/%/}
替換字符串尾部的串A為串B,
(${var/%A/B}),與第10點相似,只是這是處理的是字符串尾。
var="hello hello"
echo ${var/%o/END}
>>> hello hellEND # 將尾部的字符"o",替換成了"END"。