@@ -16,23 +16,30 @@ $ echo ${#path}
161629
1717```
1818
19- ## 返回子字符串
19+ 大括号 ` {} ` 是必需的,否则 Bash 会将 ` $# ` 理解成脚本的参数个数,将变量名理解成文本。
2020
21- Bash 返回一个字符串的子串,语法如下。
21+ ``` bash
22+ $ echo $# myvar
23+ 0myvar
24+ ```
25+
26+ ## 子字符串
27+
28+ Bash 可以返回一个字符串的子串,语法如下。
2229
2330``` bash
2431${varname: offset: length}
2532```
2633
27- 上面语法的含义是返回` $varname ` 的子字符串,从位置` offset ` 开始(以 ` 0 ` 作为基点 ),长度为` length ` 。
34+ 上面语法的含义是返回` $varname ` 的子字符串,从位置` offset ` 开始(从 ` 0 ` 开始计算 ),长度为` length ` 。
2835
2936``` bash
3037$ count=frogfootman
3138$ echo ${count: 4: 4}
3239foot
3340```
3441
35- 上面例子返回字符串` frogfootman ` 从4号位置开始的长度为4的子字符串。
42+ 上面例子返回字符串` frogfootman ` 从4号位置开始的长度为4的子字符串` foot ` 。
3643
3744如果省略` length ` ,则从位置` offset ` 开始,一直返回到字符串的结尾。
3845
5663
5764上面例子中,` offset ` 为` -5 ` ,表示从倒数第5个字符开始截取,所以返回` long. ` 。如果指定长度为` 2 ` ,则返回` lo ` 。
5865
59- ## 字符串的处理
66+ 大括号里面的第一个参数,总是变量名,不能直接使用字符串。
67+
68+ ``` bash
69+ # 报错
70+ $ echo ${" hello" : 2: 3}
71+ ```
72+
73+ 上面例子中,` "hello" ` 不是变量名,导致 Bash 报错。
74+
75+ ## 搜索和替换
6076
61- Bash 提供字符串处理的多种方法 。
77+ Bash 提供字符串替换的多种方法 。
6278
6379** (1)删除开头的匹配。**
6480
65- 以下语法可以删除字符串开头匹配的部分,但不会改变原始变量。匹配模式可以使用 ` * ` 、 ` ? ` 、 ` [] ` 等通配符。
81+ 以下语法可以删除字符串开头匹配的部分,但不会改变原始变量。
6682
6783``` bash
6884# 如果 pattern 匹配变量 variable 的开头,
@@ -74,7 +90,9 @@ ${variable#pattern}
7490${variable## pattern}
7591```
7692
77- 上面两种语法会删除变量字符串开头的匹配部分,返回剩下的部分。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。
93+ 上面两种语法会删除变量字符串开头的匹配部分(将其替换为空),返回剩下的部分。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。
94+
95+ 匹配模式` pattern ` 可以使用` * ` 、` ? ` 、` [] ` 等通配符。
7896
7997下面是一个例子。
8098
@@ -101,6 +119,16 @@ long.file.name
101119
102120上面例子中,模式` */ ` 匹配目录部分,所以只返回文件名。
103121
122+ 下面再看一个例子。
123+
124+ ``` bash
125+ $ phone=" 555-456-1414"
126+ $ echo ${phone#* -}
127+ 456-1414
128+ $ echo ${phone##* -}
129+ 1414
130+ ```
131+
104132** (2)删除结尾的匹配。**
105133
106134以下语法可以删除字符串结尾匹配的部分,但不会改变原始变量。
@@ -115,7 +143,7 @@ ${variable%pattern}
115143${variable%% pattern}
116144```
117145
118- 上面两种语法会删除变量字符串结尾的匹配部分,返回剩下的部分。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。
146+ 上面两种语法会删除变量字符串结尾的匹配部分(将其替换为空) ,返回剩下的部分。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。
119147
120148下面是一个例子。
121149
@@ -152,6 +180,16 @@ foo.jpg
152180
153181上面的例子将文件的后缀名,从` .png ` 改成了` .jpg ` 。
154182
183+ 下面再看一个例子。
184+
185+ ``` bash
186+ $ phone=" 555-456-1414"
187+ $ echo ${phone% -* }
188+ 555-456
189+ $ echo ${phone%% -* }
190+ 555
191+ ```
192+
155193** (3)替换子串。**
156194
157195以下语法可以将字符串的最长匹配(贪婪匹配),换成其他的字符串返回,但不会改变原始变量。
@@ -190,6 +228,16 @@ $ echo -e ${PATH//:/'\n'}
190228
191229上面例子中,` echo ` 命令的` -e ` 参数,表示将替换后的字符串的` \n ` 字符,解释为换行符。
192230
231+ 模式部分可以使用通配符。
232+
233+ ``` bash
234+ $ phone=" 555-456-1414"
235+ $ echo ${phone/ 5?4/ -}
236+ 55-56-1414
237+ ```
238+
239+ 上面的例子将` 5-4 ` 替换成` - ` 。
240+
193241如果省略了` string ` 部分,那么就相当于匹配的部分替换成空字符串,即删除匹配的部分。
194242
195243``` bash
@@ -225,3 +273,25 @@ $ echo ${foo/%JPG/jpg}
225273JPG.jpg
226274```
227275
276+ ## 改变大小写
277+
278+ 下面的语法可以改变变量的大小写。
279+
280+ ``` bash
281+ # 转为大写
282+ ${varname^^}
283+
284+ # 转为小写
285+ ${varname,,}
286+ ```
287+
288+ 下面是一个例子。
289+
290+ ``` bash
291+ $ foo=heLLo
292+ $ echo ${foo^^}
293+ HELLO
294+ $ echo ${foo,,}
295+ hello
296+ ```
297+
0 commit comments