大家好,今天給大家分享的是shell編程中的函數用法,當然這個函數和數學的函數是不一樣的,那么在shell中的函數是什么樣的,那么一起來看一下。
1、首先在linux中它有一個命令是:alias 也就是別名的意思,那么這時候我們需要實際操作看看這個alias到底有什么用,如下:

在以上圖中我們使用了alias命令 后面跟着N=XXX 那么這個N呢就是一個別名,簡單的說,當我們啟動Nginx服務的時候我們會輸入絕對路徑,這時候我們可以設置一個別名,相當於N就等於xxx后面的那條路徑,最后我們只輸入N 那么就等於執行了啟動命令。
函數也有類似於別名的作用,簡單的說,函數的作用就是將程序里面多次被調用的代碼組合起來,稱為函數體,並取一個名字稱為(函數名),當我們需要用到這段代碼的時候,我們就可以直接來調用函數名。
2、Shell函數的語法
在shell中 if語句有它的語法,for循環也有它的語法,那么shell中的函數,那肯定也有它的語法有以下三種:
function 函數名 () { 指令... return -n } function 函數名 { 指令... return -n } 函數名 () { 指令... return -n }
提示:在以上的函數語法中,前面的funcation 表示聲明一個函數!!! 可以不寫 return -n 是指退出函數
例1:Shell函數實例如下
function fj () { echo "我是風姐!" } function zhangsan () { echo "我是張三!" } fj zhangsan
剖析: function fj () { # 前面的function是聲明一個函數 名字叫 fj () { echo "我是風姐!" #下面呢 我們執行操作.echo 我是風姐 } #最后 我們以 } 為結束 function zhangsan () { # 前面的function是聲明一個函數 名字叫 zhangsan () { echo "我是張三!" #下面呢 我們執行操作.echo 我是張三 } #最后 我們以 } 為結束 fj #調用fj 函數 zhangsan #調用zhangsan函數
那么定義了兩個函數,我們最終目的是要調用它所以 在函數的下面輸入了fj 和 zhangsan 意思是說 我要調用這兩個函數,那么這兩個函數中有兩個命令 輸出一個張三和鳳姐,所以在我們執行腳本的時候結果就會是如下:

例2:分離函數體執行函數的腳本文件
cat >>/etc/init.d/functions<< EOF function zhangsan () { echo "我就是張三" } EOF
以上代碼什么意思:我們可以看到第一行是cat >> /etc/....這個路徑 我們完全可以理解為,把下面的內容 導入到/etc/init.d/functions這個文件中; 那么這個文件是Linux系統內置的腳本函數庫

我們可以清楚的看到我們寫的函數已經導入到了/etc/init.d/functions 這個文件中,那么接下來進行操作了 如下:
#!/bin/bash if [ -f /etc/init.d/functions ] then . /etc/init.d/functions fi zhangsan
解釋:if 如果/etc/init.d/functions是一個普通文件,那么我們執行. /etc/init.d/functions 在這里這個"."是用來加載functions 中的命令或者變量參數等;最后因為我們在上面定義了zhangsan這個函數,那我們在最后一行可以調用這個zhangsan函數 輸出如下:

那么在這里我們來一個總結:
當我們定義函數過多的情況下,我們可以把函數寫在某一個文件中,當我們寫腳本的時候需要用到這個函數中的某一個指令,那么我們就可以直接來調用文件中的函數名!
例3:編寫帶參數的shell函數實例
#!/bin/bash function lisi () { echo 我的名字叫: $1 } lisi $1
在這里我們定義了一個名字叫做lisi的函數,這里需要注意的是echo那行,正常的輸出是沒有問題的,但是在后面加了一個特殊的位置變量。$1 最后在我們調用函數的時候 后面也加了特殊位置變量 $1 執行效果如下:

3、利用Shell函數開發企業級URL檢測腳本
這是書上的一部分案例,但是我還會在這里通過我的想法來解釋整個腳本中的全部過程!
1)首先我們不用函數來寫一個檢測URL的腳本如下:
#!/bin/bash #no.1 if [ "$#" -ne 1 ] then echo "/root/sh/ $0" 請您輸入一個網址 exit 1 fi #no.2 wget --spider -q -o /dev/null --tries=1 -T 3 $1 if [ "$?" -eq 0 ] then echo "$1 檢測是成功的!" else echo "$1 檢測是失敗的!" exit 1 fi
剖析:
#!/bin/bash #no.1 if [ "$#" -ne 1 ] #如果用戶輸入的傳參參數不是1 then # 那么 echo "/root/sh/ $0" 請您輸入一個網址 #輸出腳本路徑和腳本名稱 最后輸出請您輸入一個網址! exit 1 #退出腳本 fi #結束 #no.2 wget --spider -q -o /dev/null --tries=1 -T 3 $1 #如果用戶輸入傳參數是對的,那么執行wget命令最后$1是用戶輸入的內容 if [ "$?" -eq 0 ] #如果以上wget測試成功了! then #那么 echo "$1 檢測是成功的!" #輸出用戶輸入網址並輸出是成功的 else #否則 echo "$1 檢測是失敗的!" #輸出用戶輸入網址並輸出是失敗的 exit 1 #退出腳本 fi #fi結束
感覺不夠養眼?沒有關系,如下圖

以上此腳本中包含了特殊位置變量$#等等這些參數,大家看不懂的可以參考我之前的文章
最后運行的結果如下:

這不是重點,重點是我們使用shell函數來寫整個過程,如下:
function TS () { echo "/root/sh/ $0" 請您輸入一個網址 exit 1 } function Check_url () { wget --spider -q -o /dev/null --tries=1 -T 3 $1 if [ "$?" -eq 0 ] then echo "$1 檢測成功!" else echo "$1 檢測失敗" exit 1 fi } function JG () { if [ "$#" -ne 1 ] then TS fi Check_url $1 } JG $*
剖析:
function TS () { #定義一個名字為TS的函數 (提示的意思) echo "/root/sh/ $0" 請您輸入一個網址 #執行的指令是 輸出一個:請您輸入一個網址 exit 1 #退出 } function Check_url () { #定義一個名字為Check_url的函數 (檢測的意思) wget --spider -q -o /dev/null --tries=1 -T 3 $1 #如果用戶輸入傳參數是對的,那么執行wget命令最后$1是用戶輸 入的內容 if [ "$?" -eq 0 ] #如果以上wget去測試成功了! then #那么 echo "$1 檢測成功!" #輸出用戶輸入網址並輸出是成功的 else #否則 echo "$1 檢測失敗" # 輸出用戶輸入網址並輸出是失敗的 exit 1 #退出 fi } function JG () { #這是最后的函數JG(結果的意思) if [ "$#" -ne 1 ] ##如果用戶輸入的傳參參數不是1 then #那么 TS #注意了!!! 調用TS fi Check_url $1 #如果上面傳參是1 那么就調用Check_url函數 } JG $* #這里的$*就是把命令行接收的所有參數作為函數傳給函數內部
最后我們再次執行腳本

最后為了能夠讓大家清晰的看到if語句的腳本和函數腳本的對比,一張圖解釋:

4、案例二 實現菜單腳本,使用函數編寫如下:
function CDAN(){ cat << yankerp +------------------------------------------------+ | | | _o0o_ 1. 安裝Nginx | | 08880 2. 安裝Apache | | 88"."88 3. 安裝MySQL | | (|-_-|) 4. 安裝PHP | | 0\=/0 5. 部署LNMP環境 | | __/ \__ 6. 安裝zabbix監控 | | ‘\ ///‘ 7. 退出此管理程序 | | / Linux一鍵 \ 8. 關閉計算機 | | || Server || ====================== | | \ //// 一鍵安裝服務 | | ||| i i i ||| by Yankerp | | ___ ___ ====================== | |___‘. /--.--\ .‘___ | +------------------------------------------------+ yankerp } CDAN LOG_DIR=/usr/local/src read -p "請您輸入1-8任意數值:" NUM if [ ${#NUM} -ne 1 ] then echo "請您輸入1|2|3|4|5|6|7|8" exit 1 fi expr $NUM + 1 &>/dev/null if [ "$?" -ne 0 ] then echo "請您輸入數值!" exit 1 fi if [ "$NUM" -gt 8 ];then echo "請您輸入比8小的數值" exit 1 elif [ "$NUM" -eq 0 ];then echo "請您輸入比0大的數值" exit 1 fi ###################### function Nginx_DIR() { yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel &>/dev/null if [ $? -eq 0 ] then cd $LOG_DIR && wget http://nginx.org/download/nginx-1.12.2.tar.gz &>/dev/null && useradd -M -s /sbin/nologin nginx && \ tar zxf nginx-1.12.2.tar.gz && cd nginx-1.12.2/ && \ ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx &>/dev/null && make &>/dev/null && make install &>/dev/null fi if [ -e /usr/local/nginx/sbin/nginx ];then ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && nginx && echo "Nginx安裝並啟動成功!!!" fi } if [ $NUM -eq 1 ] then echo "開始安裝Nginx請稍等..." && Nginx_DIR fi
輸出如下:


以上腳本首先通過了if語句進行各種判斷, 判斷用戶輸入的參數等等;在后面使用了函數 來定義了安裝Nginx的操作,最后我們調用了函數使整個函數運行了起來!!!
呃,大家可以參考參考,若寫的不好請諒解~ 我感覺對剛開始接觸shell的人還是蠻有幫助的,只不過使用了多分支的if語句,感覺有點繁瑣,接下來就會更新case語句了這樣就可以解決多分支if語句很繁瑣的問題!!!
