函數定義、使用

    1、函數介紹

        函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。

         

        ? 它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分

        使用時, 在shell 中  source  /path fo function_file,函數將保留至用戶退出,也可以使用 unset function_name ,撤銷函數

         ? 函數和shell程序比較相似,區別在于:

        ? Shell程序在子Shell中運行

        ? 而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以對shell中變量進行修改

      

    2、函數返回值

       函數有兩種返回值:

         ? 函數的執行結果返回值:

            (1) 使用echo或printf命令進行輸出

            (2) 函數體中調用命令的輸出結果

         ? 函數的退出狀態碼:

            (1) 默認取決于函數中執行的最后一條命令的退出狀態碼

            (2) 自定義退出狀態碼, 其格式為:

                 return 從函數中返回,用最后狀態命令決定返回值

                return 0 無錯誤返回。

                return 1-255 有錯誤返回

  

    3、在腳本中定義、使用函數

          函數定義:

            函數在使用前必須定義,因此應將函數定義放在腳本開始部分,

            直至shell首次發現它后才能使用

          ? 調用函數僅使用其函數名即可。

         ? 示例:

            $cat func1

            #!/bin/bash

            # func1

            hello()

            {

            echo "Hello there today's date is `date +%F`"

            }

            echo "now going to the function hello"

            hello

            echo "back from the function

            

        使用函數:

            可以將經常使用的函數存入函數文件,然后將函數文件載入shell。

            ?文件名可任意選取,但最好與相關任務有某種聯系。例如: functions.main

            ?一旦函數文件載入shell,就可以在命令行或腳本中調用函數。

            可以使用set命令查看所有定義的函數,其輸出列表包括已經載入shell的所有函數。

            

            ?若要改動函數,首先用unset命令從shell中刪除函數。改動完畢后,再重新載入此文件

            

        創建函數文件:

            函數文件示例:

            $cat functions.main

            #!/bin/bash

            #functions.main

            findit()

            {

            if [ $# -lt 1 ] ; then

            echo "Usage:findit file"

            return 1

            fi

            find / -name $1 –print

            }

            

        載入函數:

            函數文件已創建好后,要將它載入shell

            ? 定位函數文件并載入shell的格式:

                    . filename 或 source filename

            ? 注意:此即<點> <空格> <文件名>

                    這里的文件名要帶正確路徑

            

            ? 示例:上例中的函數,可使用如下命令:

                    $ . functions.main

        

        執行函數:

                要執行函數,簡單地鍵入函數名即可:

            ? 示例:

                $findit groups

                /usr/bin/groups

                /usr/local/backups/groups.bak

            

        刪除函數:

            現在對函數做一些改動。首先刪除函數,使其對shell不可用。使用unset命令完成此功能.

            ? 命令格式為:

                ? unset function_name

            ? 實例:

                $unset findit

                再鍵入set命令,函數將不再顯示

            

        函數參數:

            函數可以接受參數:

            傳遞參數給函數:調用函數時,在函數名后面以空白分隔

            給定參數列表即可;例如“ testfunc arg1 arg2 …”

            在函數體中當中,可使用$1, $2, …調用這些參數;還

                可以使用$@, $*, $#等特殊變量

      

    4、函數變量

            變量作用域:

            環境變量:當前shell和子shell有效

            本地變量:只在當前shell進程有效,為執行腳本會啟動專用子shell進程;因此,本地變量的作用范圍是當前shell腳本

                  程序文件,包括腳本中的函數。

            局部變量:函數的生命周期;函數結束時變量被自動銷毀

            

            ? 注意:如果函數中有局部變量,如果其名稱同本地變量, 使用局部變量。

            

            ? 在函數中定義局部變量的方法

                local NAME=VALUE

            為了避免函數中變量與shell中已經定義的變量或者命令名字沖突,盡可能使用局部變量

            

    5、函數遞歸

            函數遞歸:

                函數直接或間接調用自身

                (注意遞歸層數)

            

            ? 遞歸實例:

            階乘是基斯頓·卡曼于 1808 年發明的運算符號,是數學術語一個正整數的階乘( factorial)是

            所有小于及等于該數的正整數的積,并且有0的階乘為1。自然數n的階乘寫作n!。

            

            n!=1×2×3×…×n。

            階乘亦可以遞歸方式定義: 0!=1, n!=(n-1)!×n。

            n!=n(n-1)(n-2)…1

            n(n-1)! = n(n-1)(n-2)

            

            ? 示例: fact.sh

            #!/bin/bash

            #

            fact() {

            if [ $1 -eq 0 -o $1 -eq 1 ]; then

            echo 1

            else

            echo $[$1*$(fact $[$1-1])]

            fi

            }

            fact 5

            

原創文章,作者:ldt195175108,如若轉載,請注明出處:http://www.www58058.com/38776

(0)
ldt195175108ldt195175108
上一篇 2016-08-22
下一篇 2016-08-22

相關推薦

  • 學習的第二周

    硬鏈接不能跨分區,硬鏈接不支持對目錄的創建, 硬鏈接的本質是一個文件N個節點  ls |xargs rm 解決參數太長 無法正常刪除的問題。   軟連接 依賴于原始文件 刪除就沒了軟連接可以跨分區,可以根據目錄創建軟連接,而且還可以針對文件夾 軟連接依賴于原始文件。原始文件刪了軟連接就打不開了  相對路徑一般相對當前工作目錄,但…

    Linux干貨 2017-05-30
  • 關于大型網站技術演進的思考(九)–網站靜態化處理–總述(1)

    原文出處: 夏天的森林    在存儲瓶頸的開篇我提到像hao123這樣的導航網站只要它部署的web服務器數量足夠,它可以承載超大規模的并發訪問量,如果是一個動態的網站,特別是使用到了數據庫的網站是很難做到通過增加web服務器數量的方式來有效的增加網站并發訪問能力的。但是現實情況是像淘寶、京東這樣的大型動態網站在承擔高并發的情況下…

    Linux干貨 2015-03-11
  • 【26期】Linux第二周學習小總結

    關于用戶組的一些小小的整理     本周學習很多的知識,一些文件管理的技巧和命令,重定向和管道的實用技巧和拓展,最后則是到了我們的用戶組的權限和管理,既然說到了管理,我們都知道在Linux中,老師講的最多的一句話就是一切皆文件,既然是文件就會有用戶去用,在里面進行各種的操作,比如增刪改查啊,對文件的重新定義啊,那我們就…

    2017-07-21
  • Linux系統上命令的使用格式

    第一部分:Linux系統上命令的使用格式 命令的語法通用格式:      COMMAND OPTIONS ARGUMENTS     發起一個命令:請求內核將某個二進制程序運行為一個進程;      程序 —-> 進程   &nbs…

    Linux干貨 2016-08-15
  • poweroff

    poweroff命令詳解

    Linux干貨 2018-03-04
  • 文本處理和正則表達式練習(0805)

    1、找出ifconfig命令結果中本機的所有IPv4地址     1.1 Centos7     1.2 Centos6 2、查出分區空間使用率的最大百分比值,取各分區利用率的數值 取出各分區數值 取出最大百分比 3、查出用戶UID最大值的用戶名、 UID及shell類型 4、查出/tmp…

    Linux干貨 2016-08-06

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-22 14:02

    總結的很不錯,以后的作業記得按時提交哦

欧美性久久久久