Linux下如何编写和使用自定义的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. ### Function to show logged user 
  9. showUSERS() { 
  10.   echo -e “Below are the user logged on the system:\n” 
  11.   w 
  12. ### Print a user’s details  
  13. printUSERDETS() { 
  14.   oldifs="$IFS"    ### store old internal field separator 
  15.   IFS=:                 ### specify a new internal field separator 
  16.   read -p "Enter user name to be searched:" uname   ### read username 
  17.   echo "" 
  18.   ### read and store from a here string values into variables 
  19.   ### using : as  a  field delimiter 
  20.   read -r username pass uid gid comments homedir shell <<< "$(cat /etc/passwd | grep   "^$uname")" 
  21.   ### print out captured values 
  22.   echo -e "Username is            : $username\n" 
  23.   echo -e "User's ID                 : $uid\n" 
  24.   echo -e "User's GID              : $gid\n" 
  25.   echo -e "User's Comments    : $comments\n" 
  26.   echo -e "User's Home Dir     : $homedir\n" 
  27.   echo -e "User's Shell             : $shell\n" 
  28.   IFS="$oldifs"         ### store old internal field separator 

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

如何从函数库中调用函数

要使用某个 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 脚本中从函数库中调用库中的某些函数。

在之后,我们还会介绍一种相当简单直接的方式来将 Vim 配置为一个编写 Bash 脚本的 IDE(集成开发环境)。在那之前,记得要经常关注我们 ,如果能和我们分享你对这份指南的想法就更好了。

作者简介:

Aaron Kili 是一名 Linux 和 F.O.S.S 爱好者、一名未来的 Linux 系统管理员、web 开发者,目前是一名 TecMint 上的内容创造者,他喜欢计算机相关的工作,并且坚信知识的分享。

作者:Aaron Kili

来源:51CTO

时间: 2024-09-10 12:20:25

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

linux下如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况?

问题描述 linux下如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况? 初学,linux(ubuntu)环境下,如何编写代码用于监控特定程序的CPU,内存,磁盘和网络使用情况?初学者,希望从这些基础程序入手,谢谢大家~ 解决方案 读取proc下面的文件. /proc/stat 里面是CPU使用情况,/proc/meminfo里面是内存使用情况,进程信息在/proc/$pid/stat,statm里面. /proc/net/dev里面是网络使用情况,磁盘IO可以使用iostat命令

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

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

linux下代替system的基于管道的popen和pclose函数

linux下使用system需要谨慎,那么代替它的方法是什么呢? 标准I/O函数库提供了popen函数,它启动另外一个进程去执行一个shell命令行. 这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程. popen函数还创建一个管道用于父子进程间通信.父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数.下在给出popen.pclose的定义:   01 #include <stdio.h> 02 /* 03 函数功能:pope

linux下python3连接mysql数据库问题_linux shell

python语言的3.x完全不向前兼容,导致我们在python2.x中可以正常使用的库,到了python3就用不了了.比如说mysqldb 1.安装pymysql pymysql就是作为python3环境下mysqldb的替代物,进入命令行,使用pip安装pymysql pip install pymysql3 2.使用pymysql 在我们需要使用数据库的.py文件开头添加下面两行 import pymysql pymysql.install_as_MySQLdb() 第一行是引入pymysq

PHP在Linux下连接MSSQLServer的配置方法简述(一、Sybase库)

如果需要在Linux下访问Microsoft SQL Server或Sybase数据库,则推荐下列软件包.SybaseCommon    http://download.sybase.com/pub/ase1192_linux/sybase-common-11.9.2-3.i386.rpmSybaseOpenClient    http://download.sybase.com/pub/ase1192_linux/sybase-openclient-11.1.1-3.i386.rpm以下过程在

linux下监控网络流量的脚本_linux shell

我看了下,linux下的/proc/net/dev记录了每块网卡发送和接受的包和字节数.因此萌生想法,写了一个.运行效果: 复制代码 代码如下: [root@74-82-173-217 ~]# ./net.sh Current Ip: inet addr:74.82.173.217 Bcast:74.82.173.223 Mask:255.255.255.224 Summry info: RX bytes:203692709 (194.2 MiB) TX bytes:93525930 (89.1

linux下统计appche站点IP访问量的shell脚本_Linux

经常需要根据IP地址统计apache站点访问量,最基本的脚本. 根据IP访问量降序排列: 复制代码 代码如下: #!/bin/bash#Script_name: access_count acc_log=/usr/local/apache2/logs/access_log /bin/awk '{print $1}' $acc_log  | sort | uniq -c | sort -nr 执行效果: 复制代码 代码如下: [root@zabbix ~]# sh access_count  94

PHP在Linux下连接MSSQLServer的配置方法简述(二、FreeTDS库)

FreeTDS也一样提供有RPM包,相关的资源可以在其官方网站:http://www.freetds.org 中找到.其安装路径可以通过 rpm 命令查出.其配置文件默认位置是 /etc/freetds.conf里面有详细的注释,说明了各配置选项的作用,如果还嫌不够,FreeTDS网站上有详尽的文档.需要注意的主要有TDS的版本.不同的TDS版本对unicode的支持不一样,详情请看文档.--本文既然是简述,那就不会是一个详细的指南:)

linux下rsync同步本地到远程的shell脚本

手动同步 rsync_ssh.sh文件代码 #!/bin/bash PRG="$0" while [ -h "$PRG" ] ; do   ls=`ls -ld "$PRG"`   link=`expr "$ls" : '.*-> \(.*\)$'`   if expr "$link" : '/.*' > /dev/null; then     PRG="$link"   e