在 Linux 系统下,Shell 脚本可以在各种不同的情形下帮到我们,例如展示信息,甚至 自动执行特定的系统管理任务,创建简单的命令行工具等等。
在本指南中,我们将向 Linux 新手展示如何可靠地存储自定义的 shell 脚本,解释如何编写 shell 函数和函数库,以及如何在其它的脚本中使用函数库中的函数。
Shell 脚本要存储在何处
为了在执行你自己的脚本时不必输入脚本所在位置的完整或绝对路径,脚本必须被存储在 $PATH
环境变量所定义的路径里的其中一个。
使用下面的命令可以查看你系统中的 $PATH
环境变量:
$ echo $PATH
/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 的脚本,或者其它程序):
$ mkdir ~/bin
接着,建立一个名为 lib
(libraries 的简写)的目录来存放你自己的函数库。你也可以在其中存放其它编程语言的函数库,如 C ,Python 等语言。在 lib
目录下建立另一个名为 sh
的目录,这个目录将被用来存放你的 shell 函数库:
$ mkdir -p ~/lib/sh
创建你自己的 Shell 函数和函数库
一个 shell 函数
就是在脚本中能够完成特定任务的一组命令。它们的工作原理与其他编程语言中的过程(LCTT 译注:可能指的是类似 SQL 中的存储过程之类的吧)、子例程、函数类似。
编写一个函数的语法如下:
函数名() { 一系列的命令 }
( LCTT 校注:在函数名前可以加上 function
关键字,但也可省略不写)
例如,你可以像下面那样在一个脚本中写一个用来显示日期的函数:
showDATE() {date;}
每当你需要显示日期时,只需调用该函数的函数名即可:
$ showDATE
简单来说 shell 函数库也是一个 shell 脚本,不过你可以在一个函数库中仅存储其它 shell 脚本中需要调用的函数。
下面展示的是在我的 ~/lib/sh
目录下一个名为 libMYFUNCS.sh
的库函数:
#!/bin/bash
### Function to clearly list directories in PATH
showPATH() {
oldifs="$IFS" ### store old internal field separator
IFS=: ### specify a new internal field separator
for DIR in $PATH do echo $DIR done
IFS="$oldifs" ### restore old internal field separator
}
### Function to show logged user
showUSERS() {
echo -e “Below are the user logged on the system:\n”
w
}
### Print a user’s details
printUSERDETS() {
oldifs="$IFS" ### store old internal field separator
IFS=: ### specify a new internal field separator
read -p "Enter user name to be searched:" uname ### read username
echo ""
### read and store from a here string values into variables
### using : as a field delimiter
read -r username pass uid gid comments homedir shell