File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
183203Bash 有以下快捷键,可以大大方便操作。
Original file line number Diff line number Diff 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+ # 第一种
263266fn () {
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
282292hello world
283293```
284294
285- 下面是显示当前日期时间的函数 。
295+ 下面是一个多行函数的例子,显示当前日期时间 。
286296
287297``` bash
288298today () {
@@ -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 ` 命令声明局部变量。
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments