1. 程式人生 > >linux基礎(二十)----linux程式設計基礎----子程式----函式

linux基礎(二十)----linux程式設計基礎----子程式----函式

    寫一個又大又複雜的程式的技巧之一,就是將該程式分解成一些稱之為子程式的小程式,而在每一個子程式中,又可以把重複出現的程式碼組織到一起形成一個函式。

    函式和子程式執行的是主程式某一特定的任務。我們要做的工作就是寫一個主程式,當需要某一個函式和子程式的時候就呼叫它們。

   本章先了解函式。

   在編寫Linux程式的時候,有時不得不一遍又一遍地重寫某些相同的命令。例如,給朋友寫一份邀請信,請他們來參加一個狂歡舞會。可把這些資訊寫在一個for in迴圈中,並將每個朋友的名字放在一個單詞表中。當然,也可以把每一份邀請信都寫程序序中,只不過是將內容重寫幾次罷了。或者使用一個函式。


    函式(function)是Linux程式的一部分,與程式的其餘部分是分開的。試設想一下:一個函式就像程式中的一個分隔倉。我們先給一個函式取一個惟一的名字(即函式名),然後就可以把經常要使用的一條或多條命令放入函式之中。
    當linux需要使用存放在函式中的命令時,可以在程式中鍵人該函式的名字。因此,通過使用函式名就可以重複使用函式中的命令,而不必再重寫這些命令。譬如,把那些邀請詞放在一個函式中。
    在每次呼叫函式時,可以給函式傳遞一定的資訊。這個過程稱之為給函式傳遞引數。因此,可以建立一個列印邀請信的函式,每呼叫它一次,就給函式傳遞一個名字,而函式則會自動地把名字賦給函式中的某個變數。以後,當涉及到那位朋友的時候,代表他的就是一個變數,而不是他的名字。

   通常使用函式來處理傳遞給函式的某些資訊,然後,將處理結果返回到程式的呼叫處。函式處理後返回的結果稱之為返回值(return value)。我們可以在程式中利用這個返回值。
    如果需要重寫某段程式碼,就可以使用函式來代替它。

建立一個函式

    在使用一個函式之前,必須先在程式中定義一個函式。因此,建立一個函式最好的地方是在程式的開始位置。建立函式也稱之為定義函式,定義的結果稱為函式定義。

定義一個函式請遵循下述步驟:
1.首先在程式中鍵入一個關鍵字function。
  它表示要建立一個函式。
2.給函式起一個名字。且它在程式中沒有任何重名。
  函式的名稱最好能反映函式的功能。
3.在函式名和第一個命令之間要使用一個開大括號"{"。
  它表示函式執行命令的入口。
4.在函式體中鍵入所需要的任何命令。
  在函式體中使用在本書中討論的任何命令都可以。
5.在函式體每一個命令之後,下一個命令之前用一個分號";"隔開。
  注意,分號和命令之間不要留有空格。分號";"表示一個特定的命令結束。
6.在最後一個命令的分號";"之後用一個閉大括號"}"。
  注意,在最後一個分號"}"和"|"之間不要留有空格。閉大括號"|"表示函式定義的結束。

下面是函式定義的一般格式:
function name
{
command;
command;
 }
下面是一個典型的函式定義,它的作用是在螢幕上顯示一條歡迎資訊(此函式例子在本
章後面還會引用到,請留心)。
function display
{
echo "Welcome to the world"
echo "of functios"
}


呼叫一個函式

    在定義了一個函式以後,呼叫它是非常容易的。我們需要做的就是在需要使用該函式的地方用一下函式名即可。

通過函式呼叫,Linux會自動尋找該函式的定義,並執行其中的每一條指令。

    在程式執行到閉大括號“}”後,Linux返回到呼叫函式的下一行,並繼續執行其他的指令。
下面是函式呼叫的一個典型例子:

#!/bin/bash
clear
function display
echo "Welcome to the world"
echo "of functions. "
}
display


給函式傳遞引數

    例如,假設要寫一個驗證使用者ID和密碼( password)的函式,這個函式除了ID和密碼之外,還包括所有驗證使用者身份所必需的命令和資訊。在每次呼叫函式時,除了ID和密碼可以不同之外,其餘各部分都應相同。
    如果讀者想在程式中呼叫該函式,就把ID和密碼作為引數傳遞給函式,linux把它們賦給某些變數。在這個程式中,這兩個變數分別是$$1和$$2。每一個數字都指向它所對應的傳遞來的引數。注意,由於Linux在這裡期望的是數字,所以不能用其他的字元如varl來取代這些變數中的數字的。
    因此,可以用變數來取代函式定義中的資訊。例如,ID是傳遞給函式的第一個引數,密碼是傳遞給函式的第二個引數。因此,在函式定義中,當需要引用ID時就可以用變數$1,需要引用密碼時可以用變數$2。

請看下面的例子:

#!/bin/bash
clear
function verify
{
if [$1 -eq  "Bob" ]&&[$2 -eq  "555"]
      then
        echo "Verified"
    eise
        echo "Rejected"
 fi
}
verify  Bob 555


驗證傳遞給函式的引數的個數

    如果程式不能給一個函式傳遞它所需要的全部資訊,可能會遇到麻煩。例如,一個函式可
能要依據程式提供的某些資訊來進行某種計算操作。不過,如果程式根本不給函式傳遞什麼
資訊,也可能會出現錯誤。

   變數$#包含了傳遞給函式的引數的個數。通過對變數$#的值和函式實際需要的引數的
個數進行比較,就可以決定是否阻止函式處理傳遞來的資訊。請看下面的示例:
    #!/bin/bash
    clear
    function verify
    {
      if [$# -ne 2]
            then
              echo "Wrong number of arguments!"
         else
            if[$1  -eq   "Bob"] &&[$2 -eq "555"]
              then
                  echo "Verified"
            else
                   echo  "Rejected"
             fi
       fi
     }
   verify Bob 555


與子程式共享函式

    子程式同樣也可以使用程式設計師建立的函式。只要把子程式設想成是程式中的一個程式即可。
     我們建立一個用函式驗證使用者ID和密碼的程式。但這次卻想在另一個不含有該函式的程式中使用該函式。當然,不是把該函式複製到第二個程式中,而是讓第二個程式(子程式)也能分享第一個程式中的函式。
    我們可以用export命令輸出函式,實現子程式之間共享函式。然後,就可以在子程式中呼叫該子函式。請看下面的     例子:
#!/bin/bash
clear
function verify
{
  if [$# -ne  2]
        then
          echo "Wrong number of arguments!"
        else
          if[$1  -eq  "Bob"]&&[$2 -eq  "555"]
                then
                      echo "Verified"
                 else
                       echo "Rejected"
           fi
  fi
}
export verify
subprogram1
現在對加在函式定義之後的兩行說明如下:
1.在函式定義結束符“}”之後,用export命令來說明子程式subprogram1可以訪問函式
  verify。
2.程式中最後一行是呼叫子程式subprogram1。注意,子程式subprogram1並沒有包含函
  數verify的定義,但子程式可以呼叫它,因為在呼叫予程式之前已用export命令說明了
  輸出該函式verify。
子程式subprogram1如下:
#!/bin/bash
clear
verify "Bob"  "555"


從函式返回資訊

    函式就像一條雙行道,程式可以傳送資訊給函式,函式可以回送資訊給程式。比如說,不是用函式verify驗證一個使用者的ID和密碼是否正確,而是讓函式將它處理後的結果返回給呼叫程式。
那麼,呼叫程式就要決定它下面該如何操作。
    函式的返回值通常儲存在變數$?中。但要注意,返回值必須是在0到256之間的一個整數。因此,是不能將字串作為返回值返回的。
    通常是用一個關鍵字return,再在其後加上一個要返回的值的方式,從函式返回一個值。
由於返回值是一個整數,因此必須給每一個要返回的整數賦予一定的含義。例如,常用0表示函式執行正常,用非0表示函式執行出錯。
    關鍵字return可以放在函式中的任意位置,但它通常放在函式驗證某些值-----如比較ID和密碼的位置之後。Linux執行到return之後,函式就停止往下執行,返回到主程式的呼叫行。
若想知道如何從函式返回一個值,請看下面的例子:
#!/bin/bash
clear
function verify
{
    if [$# -ne  2]
        then
              return 1
      else
          if  [$1 -eq "Bob"]&&[$2 -eq "555"]
                then
                    return 0
                  else
                    return  2
              echo "Rejected"
          fi
    fi
}
verify Bob 555
                              case  $? in 


       do 
       0)
         echo "Verified"
        ;;
       1)
         echo "Wrong number of arguments!"
        ;;
       2)
         echo "Rejected"
        ;;
done


相關推薦

linux基礎()----linux程式設計基礎----子程式----函式

    寫一個又大又複雜的程式的技巧之一,就是將該程式分解成一些稱之為子程式的小程式,而在每一個子程式中,又可以把重複出現的程式碼組織到一起形成一個函式。     函式和子程式執行的是主程式某一特定的任務。我們要做的工作就是寫一個主程式,當需要某一個函式和子程式的時候就

Linux常用命令和Shell程式設計基礎

目錄相關 cd - .與.. 分別表示當前目錄和父目錄 - ~與$HOME 都是指當前使用者的主目錄 - cd – 切換到上一次所在的目錄(不一定是父目錄) pwd - pwd 顯示當前目錄 - $PWD與$OLDPWD 兩個變量表示當前目錄和上一次所在的目錄 ls - ls -rtl 檢視

、Go基礎程式設計:正則表示式

正則表示式是一種進行模式匹配和文字操縱的複雜而又強大的工具。雖然正則表示式比純粹的文字匹配效率低,但是它卻更靈活。按照它的語法規則,隨需構造出的匹配模式就能夠從原始文字中篩選出幾乎任何你想要得到的字元組合。 Go語言通過regexp標準包為正則表示式提供了官方支援,如果你已

LInux C++多執行緒程式設計基礎(彙總)

1. 前言    本次來寫一篇關於C++多執行緒的基本使用。前面有一篇是互斥鎖的入門,學了兩天,做一下總結。2. 多執行緒    (1) 建立多執行緒的表示pthread_t:/* Thread identifiers. The structure of the attri

Linux)搭建JavaEE環境

mysql的安裝 serve -- 強力 devel AD ans bison inf 如果需要在Linux下進行JavaEE的開發,我們需要安裝如下軟件: 先將軟件通過Xftp5上傳到/opt下 20.1 安裝JDK (1)解壓到/op

Linux一)Shell編程

流程控制 大寫 去除 自定義函數 判斷 大數 文件名 BE mkdir 21.1 為什麽要學習Shell編程 (1)Linux運維工程師在進行服務器集群管理時,需要編寫Shell程序來進行服務器管理。 (2)對於JavaEE和Python程序員來說,工作的需要,你的老大會要

Linux命令(四) 磁盤管理命令() mkfs,mount

其它 文件系統 直接 不為 code 文件 更新 oat fst 一、格式化文件系統 mkfs 當完成硬盤分區以後要進行硬盤的格式化,mkfs系列對應的命令用於將硬盤格式化為指定格式的文件系統。mkfs 本身並不執行建立文件系統的工作,而是去調用相關的程序來執行。例如,若在

Linux命令(六) 用戶管理命令

改變 時間 su - 保留 cati shel /bin/bash 通過 UC 一、添加用戶 useradd useradd 命令用於創建新用戶,格式為useradd [選項] 用戶名。 可以使用 useradd 命令創建用戶帳戶,使用該命令創建賬戶時,默認的用戶目錄在 /

學習大資料課程 spark 基於記憶體的分散式計算框架()RDD 程式設計基礎使用

學習大資料課程 spark 基於記憶體的分散式計算框架(二)RDD 程式設計基礎使用   1.常用的轉換 假設rdd的元素是: {1,2,2,3}   很多初學者,對大資料的概念都是模糊不清的,大資料是什麼,能做什麼,學的時候,該按照什麼線路去學習,學完

執行緒基礎()-併發容器-ArrayBlockingQueue(下)

本文作者:王一飛,叩丁狼高階講師。原創文章,轉載請註明出處。 概念 ArrayBlockingQueue 是一個有界阻塞的佇列。有界原因是它底層維護了一個數組,初始化時,可以直接指定。要注意,一旦建立成功後,陣列將無法進行再擴容。而阻塞是因為它對入列出列做了加鎖處理,如果佇列滿

Linuxc基礎

關鍵字(static) 作用:修飾變數(區域性變數和全域性變數) 靜態全域性變數,作用域僅限於變數被定義的檔案中,其他檔案即使使用extern宣告也沒法使用他。 靜態區域性變數,在函式體裡面定義的,就只能在這個函式裡用了,同一個文件中的其他函式也用不了 作用:修飾函式 用內部函式的好處:

Linuxc基礎

makefile makefile 檔案 ===> 檔名:makefile 或者 Makefile 1、makefile的規則 書寫規則: 目標檔案:依賴檔案 (一個tab鍵) 命令 命令前面的tab鍵不能用空格代替 目標檔案 最終要生生成的檔案 依賴檔案 為了生成目標檔案需要

Linuxc基礎

靜態庫 靜態庫 要被包含到源程式中的庫 優點 執行速度快 缺點 佔用系統資源比較多 使用的場合 對時間要求很高的場合 靜態庫的製作: 1、把所有的源程式(.c檔案)製作成目標檔案(.o 檔案) gcc -c mul.c -o mul.o gcc -c sub.c -o sub.o g

執行緒基礎(一)-併發容器-ArrayBlockingQueue(上)

本文作者:王一飛,叩丁狼高階講師。原創文章,轉載請註明出處。 在正式講解ArrayBlockingQueue類前,先來科普一下執行緒中各類鎖,只有瞭解這些鎖之後,理解ArrayBlockingQueue那就更輕鬆了。 可重入鎖 一種遞迴無阻塞的同步機制,也叫做遞迴鎖。簡單講

Linuxc基礎

巨集定義 定義巨集之後編譯器會在預編譯的時候用真身替換替身。 在用字串巨集常量時因為路徑太長,一行寫下來比較彆扭時,用反斜槓接續符。 用巨集定義表示式時要注意:函式巨集被呼叫時是以實參代換形參,而不是“值傳遞”。 1、c的巨集只能擴充套件為用大括號括起來的初始化、常量、小括號括起來的表示

兄弟連Linux四)--DNS服務

1、域名服務基礎 1.1 DNS作用與型別 1.1.1 DNS系統的作用:               正向解析:根據主機名稱(域名)查詢對應的IP地址               反向解析:根據IP地址查詢對應的主機域名 1.1.2 域名結構 域名      

兄弟連Linux五)--郵件服務

1、郵件伺服器概述 1.1 郵件伺服器概念 1.1.1 郵件伺服器概念        電子郵件伺服器是處理郵件交換的軟硬體設施的總稱,包括電子郵件程式、電子郵件箱等。它是為使用者提供基於E-mail服務的電子郵件系統,人們通過訪問伺服器實現郵件的交換。 1.1.2 常

兄弟連Linux)--Samba服務

1、Samba簡介 1.1 資料共享方法         Windows和Linux方法無法在兩個系統中通用        Windows中最常見的是“網路上的芳鄰”。網路上的芳鄰使用的檔案系統是CIFS(通用網際網路檔案系統)協議進行資料分享           無法跨

兄弟連Linux一)VSFTP服務

1、FTP簡介和原理 1.1 FTP簡介        FTP(File Transfer Protocol)中文稱為“檔案傳輸協議”。用於Internet上的控制檔案的雙向傳輸。        “下載”檔案就是從遠端主機拷貝檔案到自己的計算機上;        “上

兄弟連Linux六)--rsync檔案同步

1、rsync伺服器遠端備份、實時備份 1.1 關於RSYNC                         一款快速增量備份工具        Remote Sync,遠端同步        支援本地複製,或者與其他SSH,rsync主機同步