# **一、shell变量子串**
## **1.子串的语法和功能**
| 子串语法 | 功能说明 |
|---|---|
|${#string}|变量最前面加井号可以返回变量的长度|
|${string:n}|变量后面加冒号并写数字,从该位置后提取字符串 |
|${string:n:m}|从n位置提取长度是m的字符串|
|${string#word}|从开头开始删除最短匹配word子串的内容 |
|${string##word}|从开头开始删除最长匹配word子串的内容|
|${string%word}|从结尾开始删除最短匹配word子串的内容|
|${string%%word}|从结尾开始删除最长匹配word子串的内容|
|${string/A/B}|用B字符串替代第一个匹配的A子串|
|${string//A/B}|用B字符串替代所有匹配的A子串|
|${string/#A/B}|如果源字符串前缀匹配A,则用B字符串替代A|
|${string/%A/B}|如果源字符串后缀匹配A,则用B字符串替代A|
> 说明:子串可以是一个正则表达式。
## **2.案例**
### 1)提取字符串和计算长度案例
* cat t1.sh
```
OLD=abcABC123ABCabc
echo ${#OLD}
echo ${OLD:6}
echo ${OLD:6:4}
```
* sh t1.sh
```
15#计算长度,合计15个字符
123ABCabc#从第6个字符串开始提取
123A#从第6个字符串开始,提取4个字符
```
### 2)匹配子串删除字符串案例
* cat /server/scripts/t1.sh
```
OLD=abcABC123ABCabc
echo ${OLD#A*C}
echo ${OLD#a*C}
echo ${OLD##a*C}
echo ${OLD%A*c}
echo ${OLD%%A*c}
```
* sh /server/scripts/t1.sh
```
abcABC123ABCabc#未能匹配到A开头的字符,原样输出
123ABCabc#从前最短匹配成功,删除abcABC
abc#从前最长匹配成功,删除abcABC123ABC
abcABC123#从后最短匹配成功,删除ABCabc
abc#从后最长匹配成功,删除ABC123ABCabc
```
### 3)匹配替换字符串案例
* cat /server/scripts/t1.sh
```
OLD=abcABC123ABCabc
echo ${OLD/ABC/MMM}
echo ${OLD//ABC/MMM}
echo ${OLD/#abc/MMM}
echo ${OLD/%abc/MMM}
```
* sh /server/scripts/t1.sh
```
abcMMM123ABCabc#将匹配到的第一个ABC替换为MMM
abcMMM123MMMabc#将匹配到的所有ABC替换为MMM
MMMABC123ABCabc#将前缀匹配到的abc替换为MMM
abcABC123ABCMMM#将后缀匹配到的abc替换为MMM
```