Skip to content

Commit a360d05

Browse files
committed
docs: edit loop
1 parent d5b9990 commit a360d05

5 files changed

Lines changed: 88 additions & 20 deletions

File tree

docs/array.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ $ echo ${#a[@]}
146146

147147
上面例子中,把字符串赋值给`100`位置的数组元素,这时的数组只有一个元素。
148148

149+
注意,如果把上面例子的`*``@`,写成具体的下标,就变成返回字符串的长度。
150+
151+
```bash
152+
$ a[100]=foo
153+
$ echo ${#a[100]}
154+
3
155+
```
156+
157+
上面例子中,`${#a[100]}`实际上是返回变量`a[100]`的值`foo`的长度。
158+
149159
`${!array[@]}``${!array[*]}`,可以返回数组的哪些位置是有值的。
150160

151161
```bash
@@ -188,11 +198,32 @@ a b d e f
188198

189199
```bash
190200
$ foo=(a b c d e f)
191-
$ foo=
201+
$ foo[1]=''
202+
$ echo ${foo[@]}
203+
a c d e f
204+
```
205+
206+
上面例子中,将数组的第二个成员设为空字符串,就删除了这个成员。
207+
208+
由于空字符串等于空值,所以下面这样写也可以,但是不推荐这种写法。
209+
210+
```bash
211+
$ foo[1]=
212+
```
213+
214+
上面的写法也相当于删除了数组的第二个成员。
215+
216+
如果不写下标,只写数组名,就相当于引用数组的第一个成员。
217+
218+
```bash
219+
$ foo=(a b c d e f)
220+
$ foo=''
192221
$ echo ${foo[@]}
193222
b c d e f
194223
```
195224

225+
上面的写法相当于删除了数组的第一个成员。
226+
196227
`unset ArrayName`可以清空整个数组。
197228

198229
```bash

docs/condition.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,10 +412,10 @@ $ [ -d temp ] || mkdir temp
412412
上面的命令会测试目录`temp`是否存在,如果不存在,就会执行第二个命令,创建这个目录。这种写法非常有助于在脚本中处理错误。
413413
414414
```bash
415-
[ -d temp ] || exit 1
415+
[ ! -d temp ] && exit 1
416416
```
417417
418-
上面的命令中,如果`temp`目录不存在,脚本会终止,并且返回值为`1`
418+
上面的命令中,如果`temp`子目录不存在,脚本会终止,并且返回值为`1`
419419
420420
`if`结构也可以直接使用上面的控制操作符。
421421
@@ -433,6 +433,27 @@ fi
433433
434434
上面的例子只有在指定文件里面,同时存在搜索词`word1``word2`,就会执行`if`的命令部分。
435435
436+
```bash
437+
[[ -d "$dir_name" ]] && cd "$dir_name" && rm *
438+
439+
# 等同于
440+
441+
if [[ ! -d "$dir_name" ]]; then
442+
echo "No such directory: '$dir_name'" >&2
443+
exit 1
444+
fi
445+
if ! cd "$dir_name"; then
446+
echo "Cannot cd to '$dir_name'" >&2
447+
exit 1
448+
fi
449+
if ! rm *; then
450+
echo "File deletion failed. Check results" >&2
451+
exit 1
452+
fi
453+
```
454+
455+
上面例子中,将一个控制操作符号的语句,改写成`if`结构。
456+
436457
## case 结构
437458
438459
`case`结构用于表达式有多个值时的判断,可以为每个值指定对应的命令。它类似于包含多个`elif``if`结构,但是语义更好。它的语法如下。

docs/expansion.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ $ echo ${SHELL}
358358
/bin/bash
359359
```
360360

361-
`${!...}`可以返回所有匹配的变量名。
361+
`${!...*}``${!...@}`可以返回所有匹配的变量名。
362362

363363
```bash
364364
$ echo ${!S*}

docs/loop.md

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,19 @@ done
1414

1515
上面代码中,只要满足条件`condition`,就会执行命令`statements`。然后,再次判断是否满足条件`condition`,只要满足,就会一直执行下去。只有不满足条件,才会退出循环。
1616

17-
判断条件`condition`可以使用`test`命令,跟`if`语句的判断一致。
17+
循环条件`condition`可以使用`test`命令,跟`if`语句的判断条件一致。
18+
19+
```bash
20+
#!/bin/bash
21+
22+
number=0
23+
while [ "$number" -lt 10 ]; do
24+
echo "Number = $number"
25+
number=$((number + 1))
26+
done
27+
```
28+
29+
上面例子中,只要变量`number`小于10,就会不断加1,直到`number`等于10,然后退出循环。
1830

1931
关键字`do`可以跟`while`不在同一行,这时两者之间不需要使用分号分隔。
2032

@@ -33,20 +45,6 @@ done
3345
$ while true; do echo 'Hi, while looping ...'; done
3446
```
3547

36-
下面是另一个例子
37-
38-
```bash
39-
#!/bin/bash
40-
41-
number=0
42-
while [ "$number" -lt 10 ]; do
43-
echo "Number = $number"
44-
number=$((number + 1))
45-
done
46-
```
47-
48-
上面例子中,只要变量`number`小于10,就会不断加1,直到`number`等于10,然后退出循环。
49-
5048
`while`的条件部分也可以是执行一个命令。
5149

5250
```bash
@@ -65,7 +63,11 @@ $ while true; false; do echo 'Hi, looping ...'; done
6563

6664
## break,continue
6765

68-
Bash 提供了两个内部命令,用来在循环内部控制程序流程。`break`命令立即终止一个循环,且程序继续执行循环之后的语句。`continue`命令导致程序跳过循环中剩余的语句,且程序继续执行下一次循环。
66+
Bash 提供了两个内部命令,用来在循环内部跳出循环。
67+
68+
`break`命令立即终止循环,程序继续执行循环之后的语句,即不再执行剩下的循环。
69+
70+
`continue`命令立即终止本轮循环,开始执行下一轮循环。
6971

7072
## until 循环
7173

@@ -194,6 +196,12 @@ done
194196
`in list`的部分可以省略,这时`list`默认等于脚本的所有参数`$@`。但是,为了可读性,最好还是不要省略,参考下面的例子。
195197
196198
```bash
199+
for filename; do
200+
echo "$filename"
201+
done
202+
203+
# 等同于
204+
197205
for filename in "$@" ; do
198206
echo "$filename"
199207
done

docs/script.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,14 @@ done
195195

196196
上面例子中,`$@`返回一个全部参数的列表,然后使用`for`循环遍历。
197197

198+
如果多个参数放在双引号里面,视为一个参数。
199+
200+
```bash
201+
$ script.sh "a b"
202+
```
203+
204+
上面例子中,Bash 会认为`"a b"`是一个参数,`$1`会返回`a b`。注意,返回时不包括双引号。
205+
198206
## shift 命令
199207

200208
`shift`命令可以改变脚本参数,每次执行都会移除脚本当前的第一个参数(`$1`),使得后面的参数向前一位,即`$2`变成`$1``$3`变成`$2``$4`变成`$3`,以此类推。

0 commit comments

Comments
 (0)