@@ -44,6 +44,18 @@ footman
4444
4545上面例子是返回变量` count ` 从4号位置一直到结尾的子字符串。
4646
47+ 如果` offset ` 为负值,表示从字符串的末尾开始算起。注意,负数前面必须有一个空格, 以防止与` ${variable:-word} ` 的变量设置默认值的形式混淆。这时,如果还指定` length ` ,则` length ` 不能小于零。
48+
49+ ``` bash
50+ $ foo=" This string is long."
51+ $ echo ${foo: -5}
52+ long.
53+ $ echo ${foo: -5: 2}
54+ lo
55+ ```
56+
57+ 上面例子中,` offset ` 为` -5 ` ,表示从倒数第5个字符开始截取,所以返回` long. ` 。如果指定长度为` 2 ` ,则返回` lo ` 。
58+
4759## 字符串的处理
4860
4961Bash 提供字符串处理的多种方法。
@@ -189,112 +201,17 @@ $ echo ${path/.*/}
189201
190202上面例子中,第二个斜杠后面的` string ` 部分省略了,所以模式` .* ` 匹配的部分` .name ` 被删除后返回。
191203
192- ## 返回变量名的展开
193-
194- ` ${!prefix*} ` 和` ${!prefix@} ` ,会返回以 prefix 开头的已有变量名,它们的执行结果相同。
195-
196- ``` bash
197- $ echo ${! BASH* }
198- BASH BASH_ARGC BASH_ARGV BASH_COMMAND BASH_COMPLETION
199- BASH_COMPLETION_DIR BASH_LINENO BASH_SOURCE BASH_SUBSHELL
200- BASH_VERSINFO BASH_VERSION
201- ```
202-
203- ## 字符串的展开
204-
205- 字符串长度
206-
207- ``` bash
208- ${# parameter}
209- ```
210-
211- ` ${#parameter} ` 展开成由 parameter 所包含的字符串的长度。通常,parameter 是一个字符串;然而,如果 parameter 是` @ ` 或者是` * ` 的话, 则展开结果是位置参数的个数。
212-
213- ``` bash
214- $ foo=" This string is long."
215- $ echo " '$foo ' is ${# foo} characters long."
216- ' This string is long.' is 20 characters long.
217- ```
218-
219- 截取子字符串。
220-
221- ``` bash
222- ${parameter: offset}
223-
224- ${parameter: offset: length}
225- ```
226-
227- 这些展开用来从 parameter 所包含的字符串中提取一部分字符。提取的字符始于 第 offset 个字符(从字符串开头算起)直到字符串的末尾,除非指定提取的长度。
228-
229- ``` bash
230- $ foo=" This string is long."
231- $ echo ${foo: 5}
232- string is long.
233- $ echo ${foo: 5: 6}
234- string
235- ```
236-
237- 若 offset 的值为负数,则认为 offset 值是从字符串的末尾开始算起,而不是从开头。注意负数前面必须有一个空格, 为防止与 ${parameter:-word} 展开形式混淆。length,若出现,则必须不能小于零。
204+ 这个语法还有两种扩展形式。
238205
239206``` bash
240- $ foo=" This string is long."
241- $ echo ${foo: -5}
242- long.
243- $ echo ${foo: -5: 2}
244- lo
245- ```
246-
247- 如果 parameter 是 @,展开结果是 length 个位置参数,从第 offset 个位置参数开始。
207+ # 模式必须出现在字符串的开头
208+ ${variable/# pattern/ string}
248209
249- 清除匹配的模式
250-
251- ``` bash
252- ${parameter# pattern}
253-
254- ${parameter## pattern}
255- ```
256-
257- 这些展开会从 paramter 所包含的字符串中清除开头一部分文本,这些字符要匹配定义的 patten。pattern 是 通配符模式,就如那些用在路径名展开中的模式。这两种形式的差异之处是该 # 形式清除最短的匹配结果, 而该 ## 模式清除最长的匹配结果。
258-
259- ``` bash
260- $ foo=file.txt.zip
261- $ echo ${foo#* .}
262- txt.zip
263- $ echo ${foo##* .}
264- zip
210+ # 模式必须出现在字符串的结尾
211+ ${variable/% pattern/ string}
265212```
266213
267- 清除匹配的模式(从尾部开始)
268-
269- ``` bash
270- ${parameter% pattern}
271-
272- ${parameter%% pattern}
273- ```
274-
275- 这些展开和上面的 # 和 ## 展开一样,除了它们清除的文本从 parameter 所包含字符串的末尾开始,而不是开头。
276-
277- ``` bash
278- $ foo=file.txt.zip
279- $ echo ${foo% .* }
280- file.txt
281- $ echo ${foo%% .* }
282- file
283- ```
284-
285- 查找和替换
286-
287- ``` bash
288- ${parameter/ pattern/ string}
289-
290- ${parameter// pattern/ string}
291-
292- ${parameter/# pattern/ string}
293-
294- ${parameter/% pattern/ string}
295- ```
296-
297- 这种形式的展开对 parameter 的内容执行查找和替换操作。如果找到了匹配通配符 pattern 的文本, 则用 string 的内容替换它。在正常形式下,只有第一个匹配项会被替换掉。在该 // 形式下,所有的匹配项都会被替换掉。 该 /# 要求匹配项出现在字符串的开头,而 /% 要求匹配项出现在字符串的末尾。/string 可能会省略掉,这样会 导致删除匹配的文本。
214+ 下面是一个例子。
298215
299216``` bash
300217$ foo=JPG.JPG
0 commit comments