Linux下如何編寫和使用自定義的Shell函數(shù)和函數(shù)庫
在 Linux 系統(tǒng)下,Shell 腳本可以在各種不同的情形下幫到我們,例如展示信息,甚至 自動執(zhí)行特定的系統(tǒng)管理任務,創(chuàng)建簡單的命令行工具等等。
在本指南中,我們將向 Linux 新手展示如何可靠地存儲自定義的 shell 腳本,解釋如何編寫 shell 函數(shù)和函數(shù)庫,以及如何在其它的腳本中使用函數(shù)庫中的函數(shù)。
Shell 腳本要存儲在何處
為了在執(zhí)行你自己的腳本時不必輸入腳本所在位置的完整或絕對路徑,腳本必須被存儲在 $PATH 環(huán)境變量所定義的路徑里的其中一個。
使用下面的命令可以查看你系統(tǒng)中的 $PATH 環(huán)境變量:
- $ echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
通常來說,如果在用戶的家目錄下存在名為 bin 的目錄,你就可以將 shell 腳本存儲在那個目錄下,因為那個目錄會自動地被包含在用戶的 $PATH 環(huán)境變量中(LCTT 譯注:在 Centos 6/7 下是這樣的,在 Debian 8 下不是這樣的,在 Ubuntu 16.04 下又是這樣的)。
因此,在你的主目錄下創(chuàng)建 bin 目錄吧(當然這里也可以用來存儲 Perl、Awk 或 Python 的腳本,或者其它程序):
- $ mkdir ~/bin
接著,建立一個名為 lib(libraries 的簡寫)的目錄來存放你自己的函數(shù)庫。你也可以在其中存放其它編程語言的函數(shù)庫,如 C ,Python 等語言。在 lib 目錄下建立另一個名為 sh 的目錄,這個目錄將被用來存放你的 shell 函數(shù)庫:
- $ mkdir -p ~/lib/sh
創(chuàng)建你自己的 Shell 函數(shù)和函數(shù)庫
一個 shell 函數(shù) 就是在腳本中能夠完成特定任務的一組命令。它們的工作原理與其他編程語言中的過程(LCTT 譯注:可能指的是類似 SQL 中的存儲過程之類的吧)、子例程、函數(shù)類似。
編寫一個函數(shù)的語法如下:
- 函數(shù)名() { 一系列的命令 }
( LCTT 校注:在函數(shù)名前可以加上 function 關(guān)鍵字,但也可省略不寫)
例如,你可以像下面那樣在一個腳本中寫一個用來顯示日期的函數(shù):
- showDATE() {date;}
每當你需要顯示日期時,只需調(diào)用該函數(shù)的函數(shù)名即可:
- $ showDATE
簡單來說 shell 函數(shù)庫也是一個 shell 腳本,不過你可以在一個函數(shù)庫中僅存儲其它 shell 腳本中需要調(diào)用的函數(shù)。
下面展示的是在我的 ~/lib/sh 目錄下一個名為 libMYFUNCS.sh 的庫函數(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<br> do<br> echo $DIR<br> 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 <<< "$(cat /etc/passwd | grep "^$uname")"
- ### print out captured values
- echo -e "Username is : $username\n"
- echo -e "User's ID : $uid\n"
- echo -e "User's GID : $gid\n"
- echo -e "User's Comments : $comments\n"
- echo -e "User's Home Dir : $homedir\n"
- echo -e "User's Shell : $shell\n"
- IFS="$oldifs" ### store old internal field separator
- }
保存文件并且給腳本添加執(zhí)行權(quán)限。
如何從函數(shù)庫中調(diào)用函數(shù)
要使用某個 lib 目錄下的函數(shù),首先你需要按照下面的形式 將包含該函數(shù)的函數(shù)庫導入到需要執(zhí)行的 shell 腳本中:
- $ . /path/to/lib
- 或
- $ source /path/to/lib
(LCTT 譯注:***行的 . 和路徑間必須是有空格的)
這樣你就可以像下面演示的那樣,在其它的腳本中使用來自 ~/lib/sh/libMYFUNCS.sh 的 printUSERDETS 函數(shù)了。
在下面的腳本中,如果要打印出某個特定用戶的詳細信息,你不必再一一編寫代碼,而只需要簡單地調(diào)用已存在的函數(shù)即可。
創(chuàng)建一個名為 test.sh 的新文件:
- #!/bin/bash
- ### include lib
- . ~/lib/sh/libMYFUNCS.sh
- ### use function from lib
- printUSERDETS
- ### exit script
- exit 0
保存這個文件,并使得這個腳本可被執(zhí)行,然后運行它:
- $ chmod 755 test.sh
- $ ./test.sh
編寫 shell 函數(shù)
在本文中,我們介紹了在哪里可靠地存儲 shell 腳本,如何編寫自己的 shell 函數(shù)和函數(shù)庫,以及如何在一個普通的 shell 腳本中從函數(shù)庫中調(diào)用庫中的某些函數(shù)。
在之后,我們還會介紹一種相當簡單直接的方式來將 Vim 配置為一個編寫 Bash 腳本的 IDE(集成開發(fā)環(huán)境)。在那之前,記得要經(jīng)常關(guān)注我們 ,如果能和我們分享你對這份指南的想法就更好了。
作者簡介:
Aaron Kili 是一名 Linux 和 F.O.S.S 愛好者、一名未來的 Linux 系統(tǒng)管理員、web 開發(fā)者,目前是一名 TecMint 上的內(nèi)容創(chuàng)造者,他喜歡計算機相關(guān)的工作,并且堅信知識的分享。