如何编写和使用自定义的 Shell 函数和函数库

在 Linux 系统下,Shell 脚本可以在各种不同的情形下帮到我们,例如展示信息,甚至 自动执行特定的系统管理任务,创建简单的命令行工具等等。

在本指南中,我们将向 Linux 新手展示如何可靠地存储自定义的 shell 脚本,解释如何编写 shell 函数和函数库,以及如何在其它的脚本中使用函数库中的函数。

Shell 脚本要存储在何处

为了在执行你自己的脚本时不必输入脚本所在位置的完整或绝对路径,脚本必须被存储在 $PATH 环境变量所定义的路径里的其中一个。

使用下面的命令可以查看你系统中的 $PATH 环境变量:


  1. $ echo $PATH
  2. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

通常来说,如果在用户的家目录下存在名为 bin 的目录,你就可以将 shell 脚本存储在那个目录下,因为那个目录会自动地被包含在用户的 $PATH 环境变量中(LCTT 译注:在 Centos 6/7 下是这样的,在 Debian 8 下不是这样的,在 Ubuntu 16.04 下又是这样的)。

因此,在你的主目录下创建 bin 目录吧(当然这里也可以用来存储 Perl、Awk 或 Python 的脚本,或者其它程序):


  1. $ mkdir ~/bin

接着,建立一个名为 lib(libraries 的简写)的目录来存放你自己的函数库。你也可以在其中存放其它编程语言的函数库,如 C ,Python 等语言。在 lib 目录下建立另一个名为 sh 的目录,这个目录将被用来存放你的 shell 函数库:


  1. $ mkdir -p ~/lib/sh

创建你自己的 Shell 函数和函数库

一个 shell 函数 就是在脚本中能够完成特定任务的一组命令。它们的工作原理与其他编程语言中的过程(LCTT 译注:可能指的是类似 SQL 中的存储过程之类的吧)、子例程、函数类似。

编写一个函数的语法如下:


  1. 函数名() { 一系列的命令 }

( LCTT 校注:在函数名前可以加上 function 关键字,但也可省略不写)

例如,你可以像下面那样在一个脚本中写一个用来显示日期的函数:


  1. showDATE() {date;}

每当你需要显示日期时,只需调用该函数的函数名即可:


  1. $ showDATE

简单来说 shell 函数库也是一个 shell 脚本,不过你可以在一个函数库中仅存储其它 shell 脚本中需要调用的函数。

下面展示的是在我的 ~/lib/sh 目录下一个名为 libMYFUNCS.sh 的库函数:


  1. #!/bin/bash
  2. ### Function to clearly list directories in PATH
  3. showPATH() {
  4. oldifs="$IFS" ### store old internal field separator
  5. IFS=: ### specify a new internal field separator
  6. for DIR in $PATH<br> do<br> echo $DIR<br> done
  7. IFS="$oldifs" ### restore old internal field separator
  8. }
  9. ### Function to show logged user
  10. showUSERS() {
  11. echo -e “Below are the user logged on the system:\n”
  12. w
  13. }
  14. ### Print a user’s details
  15. printUSERDETS() {
  16. oldifs="$IFS" ### store old internal field separator
  17. IFS=: ### specify a new internal field separator
  18. read -p "Enter user name to be searched:" uname ### read username
  19. echo ""
  20. ### read and store from a here string values into variables
  21. ### using : as a field delimiter
  22. read -r username pass uid gid comments homedir shell <<< "$(cat /etc/passwd | grep "^$uname")"
  23. ### print out captured values
  24. echo -e "Username is : $username\n"
  25. echo -e "User's ID : $uid\n"
  26. echo -e "User's GID : $gid\n"
  27. echo -e "User's Comments : $comments\n"
  28. echo -e "User's Home Dir : $homedir\n"
  29. echo -e "User's Shell : $shell\n"
  30. IFS="$oldifs" ### store old internal field separator
  31. }

保存文件并且给脚本添加执行权限。

如何从函数库中调用函数

要使用某个 lib 目录下的函数,首先你需要按照下面的形式 将包含该函数的函数库导入到需要执行的 shell 脚本中:


  1. $ . /path/to/lib
  2. $ source /path/to/lib

(LCTT 译注:第一行的 . 和路径间必须是有空格的)

这样你就可以像下面演示的那样,在其它的脚本中使用来自 ~/lib/sh/libMYFUNCS.sh 的 printUSERDETS 函数了。

在下面的脚本中,如果要打印出某个特定用户的详细信息,你不必再一一编写代码,而只需要简单地调用已存在的函数即可。

创建一个名为 test.sh 的新文件:


  1. #!/bin/bash
  2. ### include lib
  3. . ~/lib/sh/libMYFUNCS.sh
  4. ### use function from lib
  5. printUSERDETS
  6. ### exit script
  7. exit 0

保存这个文件,并使得这个脚本可被执行,然后运行它:


  1. $ chmod 755 test.sh
  2. $ ./test.sh

编写 shell 函数

在本文中,我们介绍了在哪里可靠地存储 shell 脚本,如何编写自己的 shell 函数和函数库,以及如何在一个普通的 shell 脚本中从函数库中调用库中的某些函数。

原文发布时间为:2017-03-15

本文来自合作伙伴“Linux中国”

时间: 2024-09-13 05:45:01

如何编写和使用自定义的 Shell 函数和函数库的相关文章

Linux下如何编写和使用自定义的Shell函数和函数库

在 Linux 系统下,Shell 脚本可以在各种不同的情形下帮到我们,例如展示信息,甚至 自动执行特定的系统管理任务,创建简单的命令行工具等等. 在本指南中,我们将向 Linux 新手展示如何可靠地存储自定义的 shell 脚本,解释如何编写 shell 函数和函数库,以及如何在其它的脚本中使用函数库中的函数. Shell 脚本要存储在何处 为了在执行你自己的脚本时不必输入脚本所在位置的完整或绝对路径,脚本必须被存储在 $PATH 环境变量所定义的路径里的其中一个. 使用下面的命令可以查看你系

Linux Shell学习:如何调用Shell中的函数

说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很"自然"的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法. 一.Shell中函数的定义 为了方便程序和管理和模块化并减少代码的重复,函数的确是一个好东西.而Shell中函数的定义有两种方法,如下: function fname() { statements: } 或 fname() { statements; }

youcompleteme-VIM插件YouCompleteMe如何配置才能对自定义头文件中的函数和类型进行补全

问题描述 VIM插件YouCompleteMe如何配置才能对自定义头文件中的函数和类型进行补全 我最近在折腾YouCompleteMe,对基本的C/C++关键字都能进行补全,但不能对自己项目中的头文件中的标识符进行补全,已经在 .ycm_extra_conf.py中通过'-I','自己项目头文件的路径'的方式把自己的头文件路径加入了flags中,但还是不能对自己编写的头文件中的函数和类型进行补全,应该怎么配置??? 解决方案 我看了你的答案,没什么有用的内容 解决方案二: 可以看看这篇博文: h

Shell中的函数、函数定义、作用域问题介绍_linux shell

说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很"自然"的错误,也让我吃了不少的苦头,所以总结一下Shell中函数的调用方法. 一.Shell中函数的定义 为了方便程序和管理和模块化并减少代码的重复,函数的确是一个好东西.而Shell中函数的定义有两种方法,如下: 复制代码 代码如下: function fname() {     statements: } 或 复制代码 代码如

PHP生成自定义长度随机字符串的函数

  这篇文章主要介绍了PHP生成自定义长度随机字符串的函数分享,需要的朋友可以参考下 php随机生成字符串可以自己定义自己所需要的长度,在实际应用开发中,经常遇到. 代码如下: //随机生成字符串 function random($length) { srand(date("s")); $possible_charactors = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $string = ""; whil

javascript-用自定义的传统事件绑定函数代替attachEvent的一些问题

问题描述 用自定义的传统事件绑定函数代替attachEvent的一些问题 我看了一个教程,上面写了一个用自定义的传统事件绑定函数来代替IE8及以上的老IE的attachEvent方法,主讲老师写了一点看不懂,哪位能解释一下,代码如下:HTML代码: <body> <input type=""button"" value=""按钮"" id=""button"" />

编写类String 的构造函数,析构函数和赋值函数

问题描述 编写类String的构造函数,析构函数和赋值函数已知类String的原型为classstring{public:string(constchar*str=null);//普通构造函数string(conststring&other);//拷贝构造函数---string(void);string&operate=(conststring&other);//赋值函数private:char*m-data;//用于保存字符串};请编写string的上述4个函数在线等.... 解

王亟亟的Python学习之路(五)-dictionary,set,函数,函数参数

转载请注明出处王亟亟的大牛之路 上一篇说的是循环,条件,Range,list和tuple,今天将从函数(方法)开始进一步的学习 -dictionary -set -函数 -函数参数 dictionary 键-值(key-value)存储,具有极快的查找速度.为什么反复提起查询速度,因为如果你一个用list只是为了获取里面X元素内容的话性能是相对比较查的,极力推荐"字典",字典也在第三片文章中有列出,但是这里还是再丰富下他的一些常用方法. 如何获检索dic内的值 dic={'wjj':1

C# 函数与函数重载

c# 函数与函数重载 本章的学习重点: ◆    函数的概念 ◆    函数的语法 ◆    函数的调用及执行过程 4.1函数概念 在数学领域,我们经常会听到函数的概念,比如三角函数中的正弦函数,余弦函数,正切函数,余切函数,这些对于我们来说,再熟悉不过了,只要输入相对应的变量就可以计算出结果.格式为y=f(x).x称为自变元,y称为因变元,f称为函数名. 今天,在计算机领域,也继承了这种思维方式,把一段经常需要使用的代码封装起来,在需要使用时可以直接调用,并且返回结果.格式为y=f(x).x称