Skip to content

Commit 1559e1d

Browse files
committed
docs: edit array
1 parent eb1d273 commit 1559e1d

3 files changed

Lines changed: 77 additions & 82 deletions

File tree

docs/arithmetic.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ $ echo $((number + 1))
9898
3
9999
```
100100

101-
`$[...]`也可以做整数运算。
101+
`$[...]`是以前的语法,也可以做整数运算,不建议使用
102102

103103
```bash
104104
$ echo $[2+2]

docs/array.md

Lines changed: 62 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -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
读取数组指定位置的成员,要使用下面的语法。
@@ -64,42 +86,46 @@ a[0]
6486

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

67-
如果读取数组成员时,没有读取指定哪一个位置的成员,默认使用`0`号位置
89+
`@``*`是数组的特殊索引,表示返回数组的所有成员
6890

6991
```bash
7092
$ foo=(a b c d e f)
7193
$ echo ${foo[@]}
7294
a 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[@]}
118144
1
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
232212
declare -A colors
@@ -242,3 +222,4 @@ colors["blue"]="#0000ff"
242222
```bash
243223
echo ${colors["blue"]}
244224
```
225+

docs/loop.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,20 @@ done
231231
232232
上面代码中,初始化变量`i`的值为0,循环执行的条件是`i`小于5。每次循环迭代结束时,`i`的值加1。
233233
234+
`for`条件部分的三个语句,都可以省略。
235+
236+
```bash
237+
for ((;;))
238+
do
239+
read var
240+
if [ "$var" = "." ]; then
241+
break
242+
fi
243+
done
244+
```
245+
246+
上面脚本会反复读取命令行输入,直到用户输入了一个点(`.`)位为止,才会跳出循环。
247+
234248
## select 结构
235249
236250
`select`结构主要用来生成简单的菜单。它的语法与`for...in`循环基本一致。

0 commit comments

Comments
 (0)