File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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[@]}
193222b c d e f
194223```
195224
225+ 上面的写法相当于删除了数组的第一个成员。
226+
196227` unset ArrayName ` 可以清空整个数组。
197228
198229``` bash
Original file line number Diff line number Diff 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
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` 结构,但是语义更好。它的语法如下。
Original file line number Diff line number Diff line change @@ -358,7 +358,7 @@ $ echo ${SHELL}
358358/bin/bash
359359```
360360
361- ` ${!...} ` 可以返回所有匹配的变量名。
361+ ` ${!...*} ` 或 ` ${!...@ }` 可以返回所有匹配的变量名。
362362
363363``` bash
364364$ echo ${! S* }
Original file line number Diff line number Diff line change 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
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+
197205for filename in " $@ " ; do
198206 echo " $filename "
199207done
Original file line number Diff line number Diff 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 ` ,以此类推。
You can’t perform that action at this time.
0 commit comments