223
搜狐
如何編寫和使用自定義的 Shell 函數和函數庫
在 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<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
}
保存文件並且給腳本添加執行權限。
如何從函數庫中調用函數
要使用某個 lib
目錄下的函數,首先你需要按照下麵的形式 將包含該函數的函數庫導入到需要執行的 shell 腳本中:
$ . /path/to/lib
或
$ source /path/to/lib
(LCTT 譯注:第一行的 .
和路徑間必須是有空格的)
這樣你就可以像下麵演示的那樣,在其它的腳本中使用來自 ~/lib/sh/libMYFUNCS.sh
的 printUSERDETS
函數了。
在下麵的腳本中,如果要打印出某個特定用戶的詳細信息,你不必再一一編寫代碼,而隻需要簡單地調用已存在的函數即可。
創建一個名為 test.sh
的新文件:
#!/bin/bash
### include lib
. ~/lib/sh/libMYFUNCS.sh
### use function from lib
printUSERDETS
### exit script
exit 0
保存這個文件,並使得這個腳本可被執行,然後運行它:
$ chmod 755 test.sh
$ ./test.sh
編寫 shell 函數
在本文中,我們介紹了在哪裏可靠地存儲 shell 腳本,如何編寫自己的 shell 函數和函數庫,以及如何在一個普通的 shell 腳本中從函數庫中調用庫中的某些函數。
原文發布時間為:2017-03-15
本文來自雲棲社區合作夥伴“Linux中國”
最後更新:2017-05-24 16:02:36
上一篇:
如何定製 SSH 來簡化遠程訪問
下一篇:
使用 chroot 監獄限製 SSH 用戶訪問指定目錄
Linux網絡編程socket選項之SO_LINGER,SO_REUSEADDR
Akka筆記之請求與響應
怎麼獲得當前行(gridcontrol中)在數據庫中某列的值?
使用mingw編譯SDL工程時出現WinMain@16錯誤
【轉載】如何用開源工具進行Multi-Cloud的自動化資源架構和變更?
8月12日阿裏雲服務升級公告
iPhone比小米貴3000,貴在哪裏?
mina 框架知識點部分整理
雲服務被歸類為IDC業務 牌照問題終於有了答案!
關於 "ubuntu-12.04.3-desktop-i386.iso" U盤製作後停留在syslinux版權聲明界麵問題解決