@@ -42,6 +42,28 @@ $ days=(Sun Mon Tue Wed Thu Fri Sat)
4242$ days=([0]=Sun [1]=Mon [2]=Tue [3]=Wed [4]=Thu [5]=Fri [6]=Sat)
4343```
4444
45+ 只为某些值指定位置,也是可以的。
46+
47+ ``` bash
48+ names=(hatter [5]=duchess alice)
49+ ```
50+
51+ 上面例子中,` hatter ` 是数组的0号位置,` duchess ` 是5号位置,` alice ` 是6号位置。
52+
53+ 没有赋值的数组元素是不存在的,默认值是空字符串。
54+
55+ 在数组末尾附加数据,可以使用` += ` 赋值运算符,能够自动地把值附加到数组末尾。否则,还需要知道数组的最大位置,这就比较麻烦。
56+
57+ ``` bash
58+ $ foo=(a b c)
59+ $ echo ${foo[@]}
60+ a b c
61+
62+ $ foo+=(d e f)
63+ $ echo ${foo[@]}
64+ a b c d e f
65+ ```
66+
4567## 读取数组
4668
4769读取数组指定位置的成员,要使用下面的语法。
6486
6587上面例子中,数组的第一个元素是` a ` 。如果不加大括号,Bash 会直接读取` $array ` 的值,然后将` [0] ` 按照原样输出。
6688
67- 如果读取数组成员时,没有读取指定哪一个位置的成员,默认使用 ` 0 ` 号位置 。
89+ ` @ ` 和 ` * ` 是数组的特殊索引,表示返回数组的所有成员 。
6890
6991``` bash
7092$ foo=(a b c d e f)
7193$ echo ${foo[@]}
7294a b c d e f
73- $ foo=A
74- $ echo ${foo[@]}
75- A b c d e f
7695```
7796
78- 上面例子中, ` foo ` 是一个数组,直接赋值的话,实际上是给 ` foo[0] ` 赋值 。
97+ ` for ` 循环可以遍历数组 。
7998
8099``` bash
81- $ ARRAY=(one two three)
100+ for i in " ${names[@]} " ; do
101+ echo $i
102+ done
103+ ```
82104
83- $ echo ${ARRAY[2]}
84- three
105+ 如果读取数组成员时,没有读取指定哪一个位置的成员,默认使用` 0 ` 号位置。
85106
86- $ echo ${ARRAY[*]}
87- one two three
107+ ``` bash
108+ $ foo=(a b c d e f)
109+ $ foo=A
110+ $ echo ${foo[0]}
111+ A
112+ ```
88113
89- $ echo $ARRAY [* ]
90- one[* ]
114+ 上面例子中,` foo ` 是一个数组,赋值的时候不指定位置,实际上是给` foo[0] ` 赋值。
91115
92- $ ARRAY[3]=four
116+ 引用一个不带下标的数组变量,则指的是 ` 0 ` 号位置的数组元素。
93117
94- $ echo ${ARRAY[*]}
95- one two three four
118+ ``` bash
119+ $ foo=(a b c d e f)
120+ $ echo ${foo}
121+ a
122+ $ echo $foo
123+ a
96124```
97125
98- 上面例子中,` ${ARRAY[*]} ` 可以扩展成数组的所有成员。然后,为数组添加成员也是使用 ` ARRAYNAME[indexnumber]=value ` 的语法 。
126+ 上面例子中,引用数组元素的时候,没有指定位置,结果返回的是 ` 0 ` 号位置 。
99127
100- 任何引用一个不带下标的数组变量,则指的是数组元素0:
101-
102- 要想发现数组一共包含多少成员,使用下面的语法,两种写法都可以。
128+ 要想直到数组一共包含多少成员,可以使用下面两种语法。
103129
104130``` bash
105131${# array[*]}
@@ -118,76 +144,28 @@ $ echo ${#a[@]}
1181441
119145```
120146
121- 上面例子中,尽管我们把字符串赋值给数组元素100, Bash 仅仅报告数组中有一个元素。
122-
123- ## 数组操作
124-
125- 位置参数可以用` * ` 和` @ ` 表示,它们会扩展成数组的每一个元素。
126-
127- ``` bash
128- $ animals=(" a dog" " a cat" " a fish" )
129-
130- $ for i in ${animals[*]} ; do echo $i ; done
131- a
132- dog
133- a
134- cat
135- a
136- fish
137-
138- $ for i in ${animals[@]} ; do echo $i ; done
139- a
140- dog
141- a
142- cat
143- a
144- fish
145- ```
147+ 上面例子中,把字符串赋值给` 100 ` 位置的数组元素,这时的数组只有一个元素。
146148
147- 上面例子中, ` ${animals[*] ` 和 ` ${animals[@ ]} ` 会扩展成数组的所有成员 ` a dog a cat a fish ` 。
149+ ` ${!array[@]} ` 或 ` ${!array[* ]} ` ,可以返回数组的哪些位置是有值的 。
148150
149151``` bash
150- $ for i in " ${animals[*]} " ; do echo $i ; done
151- a dog a cat a fish
152-
153- $ for i in " ${animals[@]} " ; do echo $i ; done
154- a dog
155- a cat
156- a fish
152+ $ arr=([5]=a [9]=b [23]=c)
153+ $ echo ${! arr[@]}
154+ 5 9 23
155+ $ echo ${! arr[@*]}
156+ 5 9 23
157157```
158158
159- 因为 bash 允许赋值的数组下标包含 “间隔”,有时候确定哪个元素真正存在是很有用的。为做到这一点, 可以使用以下形式的参数展开。
160-
161- ``` bash
162- ${! array[*]}
163-
164- ${! array[@]}
165- ```
159+ 上面例子中,数组的5、9、23号位置有值。
166160
167- 上面语法中, ` array ` 是一个数组变量的名字。和其它使用符号 * 和 @ 的展开一样,用引号引起来的 @ 格式是最有用的, 因为它能展开成分离的词 。
161+ 利用这个语法,也可以通过 ` for ` 循环遍历数组 。
168162
169163``` bash
170- $ foo=([2]=a [4]=b [6]=c)
171-
172- $ for i in " ${foo[@]} " ; do echo $i ; done
173- a
174- b
175- c
176- $ for i in " ${! foo[@]} " ; do echo $i ; done
177- 2
178- 4
179- 6
180- ```
164+ arr=(a b c d)
181165
182- 如果我们需要在数组末尾附加数据,那么知道数组中元素的个数是没用的,因为通过 * 和 @ 表示法返回的数值不能 告诉我们使用的最大数组索引。幸运地是,shell 为我们提供了一种解决方案。通过使用 += 赋值运算符, 我们能够自动地把值附加到数组末尾。这里,我们把三个值赋给数组 foo,然后附加另外三个。
183-
184- ``` bash
185- $ foo=(a b c)
186- $ echo ${foo[@]}
187- a b c
188- $ foo+=(d e f)
189- $ echo ${foo[@]}
190- a b c d e f
166+ for i in ${! arr[@]} ; do
167+ echo ${arr[i]}
168+ done
191169```
192170
193171## 删除数组
@@ -226,7 +204,9 @@ $ echo ${ARRAY[*]}
226204
227205## 关联数组
228206
229- 现在最新的 bash 版本支持关联数组了。关联数组使用字符串而不是整数作为数组索引。 这种功能给出了一种有趣的新方法来管理数据。
207+ Bash 的新版本支持关联数组。关联数组使用字符串而不是整数作为数组索引。
208+
209+ ` declare -A ` 可以声明关联数组。
230210
231211``` bash
232212declare -A colors
@@ -242,3 +222,4 @@ colors["blue"]="#0000ff"
242222``` bash
243223echo ${colors["blue"]}
244224```
225+
0 commit comments