1、基於模式匹配截取字符串
1、#、##號截取
#號截取,從左邊開始,以一個出現的分隔符(最左)為准,刪除左邊字符。
##號截取,從左邊開始,以最后(最右)一個分隔符為准,刪除左邊字符。
str='hello world' echo ${str#*l} echo ${str##*l}
echo ${str##*llo}

#*l 表示從左邊開始刪除第一個出現的w左邊的所有字符。##*l 表示從左邊開始刪除最后一個出現的w左邊的所有字符。
2、%、%%號截取
%號截取,從右邊開始,以一個出現的分隔符(最右)為准,刪除右邊字符。
%%號截取,從右邊開始,以最后一個出現的分隔符(最左)為准,刪除右邊字符。
str='hello world' echo ${str%l*} echo ${str%%l*}
echo ${str%lo*}

%l* 表示從右邊開始刪除第一個出現的w右邊的所有字符。%%l* 表示從右邊開始刪除最后一個出現的w右邊的所有字符。
2、字符串切片
字符串切片:${var:offset:length}
1、當length為正數
str='hello world' echo ${str:0:7} #從第0個字符開始,截取7個字符。 echo ${str:7} #從左邊開始第七個字符,一直到結束。 echo ${str:0-7:2} #從右邊開始第七個字符,截取2個字符。 echo ${str:0-7:3} #從右邊開始第七個字符,截取3個字符。 echo ${str:0-7} #從右邊開始第七個字符,一直到結束。

2、當length為負數
str='hello world' echo ${str:0:-2} #從第0個字符開始,一直到倒數第二個字符。 echo ${str:0-7:-2} #從右往作數的第七個字符開始,一直到倒數第二個字符。 echo ${str:4:-2} #從第四個字符開始,一直到倒數第二個字符。 echo ${str: -2} #從右邊開始(倒數)第二個字符,一直到最后。注意冒號后有空格,等效於${str:0-2}。

3、查找替換字符串
${var/pattern/substi}:查找var所表示的字串中,第一次被Pattern匹配到的字串,並以substi替換之。
${var//patten/substi}:查找var所表示的字串中,所有被Pattern匹配到的字串,並以substi替換之。
${var/#pattern/substi}:以行首錨定的方式將pattern匹配至var所表示的字串上,如果能匹配,則以substi替換之。
${var/%pattern/substi}:以行尾錨定的方式將pattern匹配至var所表示的字串上,如果能匹配,則以substi替換之。
以上均可使用?, *元字符。
str='hello world' echo ${str/l/e} echo ${str//l/e} echo ${str/#l/e}
echo ${str/#hel/e}
echo ${str/%ld/e}
echo ${str/h*o/hi}
echo ${str/h??/eee}

${var/pattern}:替換為空,即刪除pattern匹配到的第一次出現。
${var//pattern}: 刪除pattern匹配到的所有出現。
${var/#pattern}
${var/%pattern}
使用方法同上。
4、字符串大小寫轉換
${var^^}:小寫-->大寫
${var,,}:大寫-->小寫
str='hello WORLD' echo ${str^^} echo $str | tr '[a-z]' '[A-Z]' echo ${str,,} echo $str | tr '[A-Z]' '[a-z]'

大小寫轉換的方式很多,還包括 declare、awk等。
5、變量賦值
有無冒號存在細微差別
1、有冒號
通常用來表示變量是否有值(定義且非空)。
${var:-word}: 如果var為空或未設置,那么返回word;否則,則返回var中的值;
${var:=word}:如果var為空或未設置,那么返回word,並且將word賦值給var;否則,返回var中的值;
${var:?err_info}:如果var為空或未設置,那么返回錯誤信息;否則,則返回var自身的值;
${var:+word}:如果var自身有正常數據,則返回word;
str='hello world' echo ${str:-word} str='' echo ${str:-word} echo ${str:=word} echo $str echo ${str:?error} str='' echo ${str:?error} echo $? #查看上條命令是否返回錯誤信息 echo ${str:+word} str='asdas' echo ${str:+word}

2、無冒號
若去掉冒號則表示變量為空也視為變量有正常值存在。通常用來表示變量是否定義。
str='hello world' echo ${str-word} str='' echo ${str-word} echo ${strr-word} echo $str echo ${str?error} echo ${strr?error} echo $? #查看上條命令是否返回錯誤信息

