@@ -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
3240ARRAY=(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
86112
87113上面例子中,数组的第一个元素是` a ` 。如果不加大括号,Bash 会直接读取` $array ` 的值,然后将` [0] ` 按照原样输出。
88114
115+ ### 读取所有成员
116+
89117` @ ` 和` * ` 是数组的特殊索引,表示返回数组的所有成员。
90118
91119``` bash
@@ -102,6 +130,87 @@ for i in "${names[@]}"; do
102130done
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
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]}
1542653
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
178291done
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[@]}
188324a b c d e f
189325
190- $ unset ' foo[2]'
326+ $ unset foo[2]
191327$ echo ${foo[@]}
192328a b d e f
193329` ` `
0 commit comments