一,操作字符串
1,字符串長度
expr 命令取字符串函數

自帶shell函數讀取

2,匹配字符串開頭字串的長度
!!!!!!!!!!!!$substring是正則表達式.!!!!!!!!!
expr 格式 expr match "$string" '$substring'
expr "$string" : '$substring'

3,索引
格式
expr index $string $substring

求出第一次出現的位置
4,提取子串
1)格式:${string:position}

第五個字符開始取道最后
2)格式:${string:position:length}

從第五個字符開始取並且只取5個
反着取

上面的情況都不可以的,所以反着取只能這樣取
3)格式 expr substr $string $position $length

從某個位置取多長
4)expr match "$string" '\($substring\)' expr "$string" : '\($substring\)'
從什么地方取什么東西

5)expr match "$string" '.*\($substring\)'
從結尾提取匹配的正則字符

5,字符串消除
1)${string#substring}

最短匹配的字符清除
2)${string##substring}

最長的字符消除
3)${string%substring}

結尾的位置截取最短匹配的字符
4)${string%%substring}

從結尾位置截取最長的字符,貪婪匹配
6,字符轉替換
1)${string/substring/replacement}

惰性匹配只匹配一次內容並且替換
2)${string//substring/replacement}

全局匹配全部替換
3)${string/#substring/replacement}

如果開頭匹配到了的話就只在開頭替換
4)${string/%substring/replacement}

如果結尾匹配到了的話就只在結尾替換
5)${!varprefix*}

6)${!varprefix@}

7, 參數替換
1)${parameter-default}
如果變量parameter沒被聲明, 那么就使用默認值

2)${parameter:-default}
如果變量parameter沒被設置, 那么就使用默認值

這兩個的區別是什么呢

welcom 並沒有被聲明,就是沒有在命令行或者執行賦值操作

這樣的話welcom被聲明了但是沒有設置值
所以前一個讀取的是他的空值,應為已經聲明了
后一個聲明完了沒有設置他的值所以應用whoami的變量
3) ${parameter=default}
如果變量parameter沒聲明, 那么就把它的值設為default.
這個看起來一樣但是仔細想想上一個是應用他的值這個是設置為這個值
同樣也有
${parameter:=default} -- 如果變量parameter沒設置, 那么就把它的值設為default.
4)${parameter+alt_value}, ${parameter:+alt_value}
-
${parameter:+alt_value} -- 如果變量parameter被設置了, 那么就使用alt_value, 否則就使用null字符串.
${parameter+alt_value} -- 如果變量parameter被聲明了, 那么就使用alt_value, 否則就使用null字符串.

如果設置了值的話就用后面的值,沒有設置就用空值
5)${parameter?err_msg}, ${parameter:?err_msg}
${parameter?err_msg} -- 如果parameter已經被聲明, 那么就使用設置的值, 否則打印err_msg錯誤消息.
${parameter:?err_msg} -- 如果parameter已經被設置, 那么就使用設置的值, 否則打印err_msg錯誤消息.

