Skip to content

Commit e5f1fc6

Browse files
committed
docs: edit array
1 parent dc9098d commit e5f1fc6

2 files changed

Lines changed: 149 additions & 4 deletions

File tree

docs/array.md

Lines changed: 140 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,26 @@ $ array[2]=val
2626
$ declare -a ARRAYNAME
2727
```
2828

29+
`read -a`命令也可以将命令行输入,读入一个数组。
30+
31+
```bash
32+
$ read -a dice
33+
```
34+
35+
上面命令将用户的命令行输入,读入数组`dice`
36+
2937
数组也可以采用一次性赋值的方式创建。
3038

3139
```bash
3240
ARRAY=(value1 value2 ... valueN)
41+
42+
# 等同于
43+
44+
ARRAY=(
45+
value1
46+
value2
47+
value3
48+
)
3349
```
3450

3551
采用上面方式创建数组时,可以按照默认顺序赋值,也可以在每个值前面指定位置。
@@ -52,6 +68,14 @@ names=(hatter [5]=duchess alice)
5268

5369
没有赋值的数组元素是不存在的,默认值是空字符串。
5470

71+
定义数组的时候,可以使用通配符。
72+
73+
```bash
74+
$ mp3s=( *.mp3 )
75+
```
76+
77+
上面例子中,将当前目录的所有 MP3 文件,放进一个数组。
78+
5579
在数组末尾附加数据,可以使用`+=`赋值运算符,能够自动地把值附加到数组末尾。否则,还需要知道数组的最大位置,这就比较麻烦。
5680

5781
```bash
@@ -66,6 +90,8 @@ a b c d e f
6690

6791
## 读取数组
6892

93+
### 读取单个元素
94+
6995
读取数组指定位置的成员,要使用下面的语法。
7096

7197
```bash
@@ -86,6 +112,8 @@ a[0]
86112

87113
上面例子中,数组的第一个元素是`a`。如果不加大括号,Bash 会直接读取`$array`的值,然后将`[0]`按照原样输出。
88114

115+
### 读取所有成员
116+
89117
`@``*`是数组的特殊索引,表示返回数组的所有成员。
90118

91119
```bash
@@ -102,6 +130,87 @@ for i in "${names[@]}"; do
102130
done
103131
```
104132

133+
`@``*`放不放在双引号之中,是有差别的。
134+
135+
```bash
136+
$ activities=( swimming "water skiing" canoeing "white-water rafting" surfing )
137+
$ for act in ${activities[@]}; \
138+
do \
139+
echo "Activity: $act"; \
140+
done
141+
142+
Activity: swimming
143+
Activity: water
144+
Activity: skiing
145+
Activity: canoeing
146+
Activity: white-water
147+
Activity: rafting
148+
Activity: surfing
149+
```
150+
151+
上面的例子中,数组`activities`实际包含5个元素,但是`for...in`循环直接遍历`${activities[@]}`,会导致返回7个结果。为了避免这种情况,一般把`${activities[@]}`放在双引号之中。
152+
153+
```bash
154+
$ for act in "${activities[@]}"; \
155+
do \
156+
echo "Activity: $act"; \
157+
done
158+
159+
Activity: swimming
160+
Activity: water skiing
161+
Activity: canoeing
162+
Activity: white-water rafting
163+
Activity: surfing
164+
```
165+
166+
上面例子中,`${activities[@]}`放在双引号之中,遍历就会返回正确的结果。
167+
168+
`${activities[*]}`如果不放在双引号之中,跟`${activities[@]}`不放双引号是一样的。
169+
170+
```bash
171+
$ for act in ${activities[*]}; \
172+
do \
173+
echo "Activity: $act"; \
174+
done
175+
176+
Activity: swimming
177+
Activity: water
178+
Activity: skiing
179+
Activity: canoeing
180+
Activity: white-water
181+
Activity: rafting
182+
Activity: surfing
183+
```
184+
185+
`${activities[*]}`如果放在双引号之中,所有元素就会变成单个字符串返回。
186+
187+
```bash
188+
$ for act in "${activities[*]}"; \
189+
do \
190+
echo "Activity: $act"; \
191+
done
192+
193+
Activity: swimming water skiing canoeing white-water rafting surfing
194+
```
195+
196+
所以,拷贝一个数组的最方便方法,就是写成下面这样。
197+
198+
```bash
199+
$ hobbies=( "${activities[@]}" )
200+
```
201+
202+
上面例子中,数组`activities`被拷贝给了另一个数组`hobbies`
203+
204+
这种写法也可以用来为新数组添加成员。
205+
206+
```bash
207+
$ hobbies=( "${activities[@]" diving )
208+
```
209+
210+
上面例子中,新数组`hobbies`在数组`activities`的所有成员之后,又添加了一个成员。
211+
212+
### 默认位置
213+
105214
如果读取数组成员时,没有读取指定哪一个位置的成员,默认使用`0`号位置。
106215
107216
```bash
@@ -125,7 +234,9 @@ a
125234
126235
上面例子中,引用数组元素的时候,没有指定位置,结果返回的是`0`号位置。
127236
128-
要想直到数组一共包含多少成员,可以使用下面两种语法。
237+
### 数组的长度
238+
239+
要想知道数组的长度(即一共包含多少成员),可以使用下面两种语法。
129240
130241
```bash
131242
${#array[*]}
@@ -146,15 +257,17 @@ $ echo ${#a[@]}
146257
147258
上面例子中,把字符串赋值给`100`位置的数组元素,这时的数组只有一个元素。
148259
149-
注意,如果把上面例子的`*``@`,写成具体的下标,就变成返回字符串的长度
260+
注意,如果用这种语法去读取具体的数组元素,就会返回该元素的字符串长度。这一点必须小心
150261
151262
```bash
152263
$ a[100]=foo
153264
$ echo ${#a[100]}
154265
3
155266
```
156267
157-
上面例子中,`${#a[100]}`实际上是返回变量`a[100]`的值`foo`的长度。
268+
上面例子中,`${#a[100]}`实际上是返回变量`a[100]`的值`foo`的字符串长度。
269+
270+
### 有值的位置
158271
159272
`${!array[@]}``${!array[*]}`,可以返回数组的哪些位置是有值的。
160273
@@ -178,6 +291,29 @@ for i in ${!arr[@]};do
178291
done
179292
```
180293
294+
## 提取数组元素
295+
296+
`${array[@]:position:length}`的语法可以提取数组元素。
297+
298+
```bash
299+
$ food=( apples bananas cucumbers dates eggs fajitas grapes )
300+
$ echo ${food[@]:1:1}
301+
bananas
302+
$ echo ${food[@]:1:3}
303+
bananas cucumbers dates
304+
```
305+
306+
上面例子中,`${food[@]:1:1}`返回从数组1号位置开始的1个元素,`${food[@]:1:3}`返回从1号位置开始的3个元素。
307+
308+
如果省略长度参数,则返回从指定位置开始的所有元素。
309+
310+
```bash
311+
$ echo ${food[@]:4}
312+
eggs fajitas grapes
313+
```
314+
315+
上面例子返回从4号位置开始到结束的所有元素。
316+
181317
## 删除数组
182318
183319
删除一个数组成员,使用`unset`命令。
@@ -187,7 +323,7 @@ $ foo=(a b c d e f)
187323
$ echo ${foo[@]}
188324
a b c d e f
189325
190-
$ unset 'foo[2]'
326+
$ unset foo[2]
191327
$ echo ${foo[@]}
192328
a b d e f
193329
```

docs/variable.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,15 @@ unset NAME
178178

179179
这个命令不是很有用。因为不存在的 Bash 变量一律都等于空字符串,所以即使`unset`命令删除了变量,还是可以读取这个变量,值为空字符串。
180180

181+
所以,删除一个变量,也可以将这个变量设成空字符串。
182+
183+
```bash
184+
$ foo=''
185+
$ foo=
186+
```
187+
188+
上面两种写法,都是删除了变量`foo`
189+
181190
## 输出变量
182191

183192
像上一节那样创建的变量,都是局部变量,仅可用于当前 Shell,当前 Shell 的子 Shell 读取不到此变量。为了把变量传递到子 Shell,需要使用`export`命令。这样输出的变量,对于子 Shell 来说就是环境变量。

0 commit comments

Comments
 (0)