Skip to content

Commit 0bcc2d3

Browse files
committed
docs: edit variable
1 parent 3edd0ac commit 0bcc2d3

2 files changed

Lines changed: 104 additions & 11 deletions

File tree

docs/string.md

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,30 @@ $ echo ${#path}
1616
29
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}
3239
foot
3340
```
3441

35-
上面例子返回字符串`frogfootman`从4号位置开始的长度为4的子字符串。
42+
上面例子返回字符串`frogfootman`从4号位置开始的长度为4的子字符串`foot`
3643

3744
如果省略`length`,则从位置`offset`开始,一直返回到字符串的结尾。
3845

@@ -56,13 +63,22 @@ lo
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}
225273
JPG.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+

docs/variable.md

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,29 @@ foo_file
9797

9898
事实上,读取变量的语法`$foo`,可以看作是`${foo}`的简写形式。
9999

100+
如果变量的值本身也是变量,可以使用`${!varname}`的语法,读取最终的值。
101+
102+
```bash
103+
#!/bin/bash
104+
# test.sh
105+
106+
for myvar in USER UID SHELL
107+
do
108+
echo $myvar is ${!myvar}
109+
done
110+
```
111+
112+
运行上面的脚本,会得到下面的结果。
113+
114+
```bash
115+
$ ./test.sh
116+
USER is ruanyf
117+
UID is 1000
118+
SHELL is /bin/bash
119+
```
120+
121+
上面的例子中,变量`myvar`的值依次是`USER``UID``SHELL``${!myvar}`将它们展开成最终的值。
122+
100123
## 创建变量
101124

102125
用户创建变量的时候,一般约定,全局变量的变量名都使用大写字母,局部变量使用小写字母。
@@ -270,9 +293,9 @@ himBHs
270293

271294
特殊变量还有`$@``$#`,与脚本的参数数量有关,参见脚本一章。
272295

273-
## 确保变量存在
296+
## 变量的默认值
274297

275-
Bash 提供一些特殊语法,保证变量肯定存在,且不为空。
298+
Bash 提供一些特殊语法,设置变量的默认值,或者保证变量肯定存在,且不为空。
276299

277300
```bash
278301
${varname:-word}

0 commit comments

Comments
 (0)