Skip to content

Commit 60219a8

Browse files
committed
docs: edit function
1 parent a326f87 commit 60219a8

3 files changed

Lines changed: 84 additions & 11 deletions

File tree

docs/intro.md

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,30 @@ ls is hashed (/bin/ls)
174174
`type`命令本身也是内置命令。
175175
176176
```bash
177-
$ type echo
178-
echo is a shell builtin
177+
$ type type
178+
type is a shell builtin
179+
```
180+
181+
如果要查看一个命令的所有定义,可以使用`type -a`
182+
183+
```bash
184+
$ type -a echo
185+
echo is shell builtin
186+
echo is /usr/bin/echo
187+
echo is /bin/echo
179188
```
180189
190+
`type`命令的`-t`参数,可以返回一个命令的类型:别名(alias),关键词(keyword),函数(function),内置命令(builtin)和文件(file)。
191+
192+
```bash
193+
$ type -t bash
194+
file
195+
$ type -t if
196+
keyword
197+
```
198+
199+
上面例子中,`bash`是文件,`if`是关键词。
200+
181201
## Bash 的快捷键
182202
183203
Bash 有以下快捷键,可以大大方便操作。

docs/script.md

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -255,34 +255,44 @@ $ unalias lt
255255

256256
## 函数
257257

258-
别名只适合封装简单的单个命令,如果要封装复杂的多行命令,就需要函数
258+
函数(function)是可以重复使用的代码片段,有利于代码的复用。它与别名(alias)的区别是,别名只适合封装简单的单个命令,函数则可以封装复杂的多行命令
259259

260-
Bash 允许自定义函数,便于代码的复用。函数定义的语法如下。
260+
函数总是在当前 Shell 执行,这是跟脚本的一个重大区别。如果函数与脚本同名,函数会优先执行。但是,函数的优先级不如别名,即如果函数与别名同名,那么别名优先执行。
261+
262+
Bash 函数定义的语法有两种。
261263

262264
```bash
265+
# 第一种
263266
fn() {
264267
# codes
265268
}
269+
270+
# 第二种
271+
function fn() {
272+
# codes
273+
}
266274
```
267275

268-
上面命令中`fn`是自定义的函数名,函数代码就写在大括号之中。
276+
上面代码中`fn`是自定义的函数名,函数代码就写在大括号之中。这两种定义函数的写法是等价的
269277

270278
下面是一个简单函数的例子。
271279

272280
```bash
273-
hello() { echo "Hello $1"; }
281+
hello() {
282+
echo "Hello $1";
283+
}
274284
```
275285

276-
上面代码中,函数体里面的`$1`表示命令行的第一个参数
286+
上面代码中,函数体里面的`$1`表示函数调用时的第一个参数
277287

278-
调用方法如下
288+
调用时,可以直接执行函数名,参数跟着函数名后面
279289

280290
```bash
281291
$ hello world
282292
hello world
283293
```
284294

285-
下面是显示当前日期时间的函数
295+
下面是一个多行函数的例子,显示当前日期时间
286296

287297
```bash
288298
today() {
@@ -291,10 +301,30 @@ today() {
291301
}
292302
```
293303

294-
这个函数可以写在脚本文件里面,调用的时候直接写函数名即可
304+
查看当前 Shell 已经定义的所有函数,可以使用`declare`命令
295305

296306
```bash
297-
$ today
307+
$ declare -f
308+
```
309+
310+
上面的`declare`命令不仅会输出函数名,还会输出所有定义。输出顺序是按照函数名的字母表顺序。由于会输出很多内容,最好通过管道命令配合`more``less`使用。
311+
312+
`declare`命令还支持查看单个函数的定义。
313+
314+
```bash
315+
$ declare -f functionName
316+
```
317+
318+
`declare -F`可以输出所有已经定义的函数名,不含函数体。
319+
320+
```bash
321+
$ declare -F
322+
```
323+
324+
删除一个函数,可以使用`unset`命令。
325+
326+
```bash
327+
unset -f functionName
298328
```
299329

300330
函数里面可以用`local`命令声明局部变量。

docs/startup.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,29 @@ $include /etc/inputrc
116116
$ source .bashrc
117117
```
118118

119+
`source`命令最大的特点是在当前 Shell 执行脚本,不像直接执行脚本时,会新建一个子 Shell。所以,`source`命令执行脚本时,不需要`export`变量。
120+
121+
```bash
122+
# test.sh
123+
echo $foo
124+
```
125+
126+
上面脚本输出`$foo`变量的值。
127+
128+
```bash
129+
# 当前 Shell 新建一个变量 foo
130+
$ foo=1
131+
132+
# 打印输出 1
133+
$ source test.sh
134+
1
135+
136+
# 打印输出空字符串
137+
$ bash test.sh
138+
```
139+
140+
上面例子中,当前 Shell 的变量`foo`并没有`export`,所以直接执行无法读取,但是`source`执行可以读取。
141+
119142
`source`有一个简写形式,可以使用一个点(`.`)来表示。
120143

121144
```bash

0 commit comments

Comments
 (0)