函數定義、使用

    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 09:29
下一篇 2016-08-22 09:30

相關推薦

  • SHELL網絡爬蟲實例剖析

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1552472        前天簡單分享了用 shell 寫網絡爬蟲的一些見解,今天特地把代碼發出來與51博…

    Linux干貨 2016-08-15
  • 條件測試與基礎運算

    變量類型: 整形 數值型 字符型 byte boolen 單精度 雙精度 變量種類: 環境變量– 對所有進程有效 本地變量– 僅對當前shell有效 局部變量– 僅在函數中的某一段有效 位置變量– $1,$2,$3,$4 特殊變量– $?,$0,$*,$@,$#,$$ 變量命名法則: 1.不能出現程…

    Linux干貨 2017-04-16
  • TCP 的那些事兒(下)

    這篇文章是下篇,所以如果你對TCP不熟悉的話,還請你先看看上篇《TCP的那些事兒(上)》 上篇中,我們介紹了TCP的協議頭、狀態機、數據重傳中的東西。但是TCP要解決一個很大的事,那就是要在一個網絡根據不同的情況來動態調整自己的發包的速度,小則讓自己的連接更穩定,大則讓整個網絡更穩定。在你閱讀下篇之前,你需要做好準備,本篇文章有好些算法和策略,可能會引發你的…

    Linux干貨 2016-08-15
  • N24期linux之學習宣言

        學習linux時間已經過去了一周之余,每天下班后拖著疲憊的身體回家。雖然很累,但也覺得這次選擇很值得,但愿以后自己發展的會越來越好!     我的學習宣言是:     刻苦學習,努力超越自己。     明天的我一定會感謝今天努力的自己!     努力 …

    Linux干貨 2016-10-29
  • 基礎指令的使用篇2 Linux版

    #echo -e "\033[41;33:4:5m"\033[0m] man命令 /usr/share/man 地址 whatis passwd 查看passwd的man 章節 man n passwd 顯示passwd的第幾章man文件 man -a passwd 列出所有的章節     -f   &nbs…

    Linux干貨 2016-08-04
  • linux磁盤管理補充之掛載選項及常用工具

    一、文件掛載的配置文件         配置文件:/etc/fstab 要掛載的設備的UUID或卷標或/dev/sd[a-z]    掛載點        &n…

    Linux干貨 2016-08-30

評論列表(1條)

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

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

欧美性久久久久