Merge pull request #5180 from FSSlc/master

PRF: 20170207 How To Write and Use Custom Shell Functions and Libraries.md
This commit is contained in:
Chang Liu 2017-02-23 20:54:03 +08:00 committed by GitHub
commit eda8e19a24

View File

@ -1,60 +1,60 @@
如何编写与使用定制的 Shell 函数和功能
如何编写和使用自定义的 Shell 函数和函数
============================================================
在 Linux 系统下,我们大量的使用 Shell 脚本来帮助我们完成许多事情,其中包括展示信息,甚至[自动化某些系统管理任务][1],制作简单的命令行工具等。
在 Linux 系统下,Shell 脚本在各种不同的情形下给予我们帮助,例如展示信息,甚至 [自动执行特定的系统管理任务][1],创建简单的命令行工具等等。
在本文中,我们将向新的 Linux 用户介绍在哪里存储他们定制的 shell 脚本,解释如何编写 shell 函数和功能库,如何在其它的脚本中使用那些功能库中的函数。
在本指南中,我们将向 Linux 新手展示如何可靠地存储自定义的 shell 脚本,解释如何编写 shell 函数和函数库,以及如何在其它的脚本中使用函数库中的函数。
### 那么 Shell 脚本要存储在哪里呢
### Shell 脚本要存储在何处
为了在执行脚本的时候避免指定脚本的绝对路径,脚本必须被存储在 $PATH 这个环境变量所指定路径的其中一个路径下
为了在执行你自己的脚本时不必输入脚本所在位置的完整或绝对路径,脚本必须被存储在 `$PATH`环境变量所定义的路径里的其中一个
使用下面的命令可以查看你系统中的 $PATH 环境变量:
使用下面的命令可以查看你系统中的 `$PATH` 环境变量:
```
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
```
通常来说,如果在用户主目录下有 bin 目录存在的话,你就可以将 shell 脚本存储在那个目录下,因为那个目录会自动的包含在用户的 $PATH 环境变量中(在Centos6/7下是这样的在Debian8下不是这样的在Ubuntu16.04下又是这样的)。
通常来说,如果在用户的家目录下存在名为 `bin` 的目录,你就可以将 shell 脚本存储在那个目录下,因为那个目录会自动地被包含在用户的 `$PATH` 环境变量中(译者注:在 Centos6/7 下是这样的,在 Debian8 下不是这样的,在 Ubuntu16.04 下又是这样的)。
因此,在你的主目录下创建 bin 目录吧(当然也可以用来存储 Perl[Awk][2]Python 脚本或者是其它程序):
因此,在你的主目录下创建 `bin` 目录吧(当然这里也可以用来存储 Perl、[Awk][2] 或 Python 的脚本,或者其它程序):
```
$ mkdir ~/bin
```
接着,让我们来建立一个叫做 liblibraries 的简写)的目录来存放你自己的功能库吧。你也可以在其中存放其它编程语言的功能库如 C 语言Python 等等。在 lib 目录下建立另一个称为 sh 的目录;用这个目录来存放你的 shell 功能库:
接着,建立一个名为 `lib`libraries 的简写)的目录来存放你自己的函数库。你也可以在其中存放其它编程语言的函数库,如 C Python 等语言。在 `lib` 目录下建立另一个名为 `sh` 的目录,这个目录将被用来存放你的 shell 函数库:
```
$ mkdir -p ~/lib/sh
```
### 创建你自己的 Shell 函数和功能
### 创建你自己的 Shell 函数和函数
一个 shell 函数就是在一段脚本中能够一件特定任务的一组命令。它们使用起来和其它编程语言中的过程可能指的是类似SQL中的存储过程之类的吧子例程与函数十分相似。
一个 `shell 函数` 就是在脚本中能够完成特定任务的一组命令。它们的工作原理与其他编程语言中的过程译者注可能指的是类似SQL中的存储过程之类的吧、子例程、函数类似。
编写函数的语法如下:
编写一个函数的语法如下:
```
[function] 函数名() { 命令 } (这里添加了原文中没有的[function],下文中没有使用这种形式的因此不确定是否合适
函数名() { 一系列的命令 } (校对注:在函数名前可以加上 function 关键字,但也可省略不写
```
例如,你在脚本中写一个用来显示日期的函数:
例如,你可以像下面那样一个脚本中写一个用来显示日期的函数:
```
showDATE() {date;}
```
每当你需要显示日期时,只需要简单的调用函数的函数名即可:
每当你需要显示日期时,只需调用函数的函数名即可:
```
$ showDATE
```
简单来说 shell 功能库也是一个 shell 脚本,不过你也可以编写一个功能库来存储一些函数,以便你可以在其它的 shell 脚本中调用
简单来说 shell 函数库也是一个 shell 脚本,不过你可以在一个函数库中仅存储其它 shell 脚本中需要调用的函数
下面就是一个在我的 ~/lib/sh 目录下的功能库的实例其中包含了更多的函数示例
下面展示的是在我的 `~/lib/sh` 目录下一个名为 `libMYFUNCS.sh` 的库函数
```
#!/bin/bash
@ -91,21 +91,21 @@ IFS="$oldifs" #store old internal field separator
保存文件并且给脚本添加执行权限。
### 如何从功能库中调用函数呢?
### 如何从函数库中调用函数
要使用库里的某个函数,你首先需要使用下面列出的方式将包含改函数的功能库导入到需要执行的 shell 脚本中:
要使用某个 `lib` 目录下的函数,首先你需要按照下面的形式 将包含该函数的函数库导入到需要执行的 shell 脚本中:
```
$ . /path/to/lib (这里的. 和路径间应该是有空格的)
OR
$ . /path/to/lib (译者注:这里的 . 和路径间应该是有空格的)
$ source /path/to/lib
```
你可以像下面演示的方式一样,在其它的脚本中使用来自 ~/lib/sh/libMYFUNCS.sh 的 printUSERDETS 函数。
这样你就可以像下面演示的那样,在其它的脚本中使用来自 `~/lib/sh/libMYFUNCS.sh``printUSERDETS` 函数。
这样你就可以在这个脚本再写一遍相同的代码来输出指定的用户信息,而只需要简单的调用已存在的函数即可。
在下面的脚本中,如果要打印出某个特定用户的详细信息,你不必再一一编写代码,而只需要简单地调用已存在的函数即可。
创建一个名为 test.sh 的新文件:
创建一个名为 `test.sh` 的新文件:
```
#!/bin/bash
@ -117,7 +117,7 @@ printUSERDETS
exit 0
```
保存,添加执行权限,执行:
保存这个文件,并使得这个脚本可被执行,然后运行它:
```
$ chmod 755 test.sh
@ -129,15 +129,13 @@ $ ./test.sh
编写 shell 函数
在本文中,我们介绍了在哪里存储 shell 脚本,解释如何编写自己的 shell 函数和功能库,如何在其它的脚本中使用那些功能库中的函数。
在本文中,我们介绍了在哪里可靠地存储 shell 脚本,如何编写自己的 shell 函数和函数库,以及如何在一个普通的 shell 脚本中从函数库中调用库中的某些函数。
之后,我们还会介绍一种相当简单直接的方式来将 Vim 设置成为一个编写 Bash 脚本的 IDE集成开发环境。在那之前记得要经常关注 TecMint ,如果能和我们分享你对这份指南的想法就更好了。
之后,我们还会介绍一种相当简单直接的方式来将 Vim 配置为一个编写 Bash 脚本的 IDE集成开发环境。在那之前记得要经常关注 TecMint ,如果能和我们分享你对这份指南的想法就更好了。
--------------------------------------------------------------------------------
作者简介:
Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge.
作者简介Aaron Kili 是一名 Linux 和 F.O.S.S 爱好者、一名未来的 Linux 系统管理员、web 开发者,目前是一名 TecMint 上的内容创造者,他喜欢计算机相关的工作,并且坚信知识的分享。
--------------------------------------------------------------------------------
@ -145,7 +143,7 @@ via: http://www.tecmint.com/write-custom-shell-functions-and-libraries-in-linux/
作者:[Aaron Kili][a]
译者:[wcnnbdk1](https://github.com/wcnnbdk1)
校对:[校对者ID](https://github.com/校对者ID)
校对:[FSSlc](https://github.com/FSSlc)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出