shell(六)

Shell 函數

linux shell 可以用戶定義函數,然后在shell腳本中可以隨便調用。
shell中函數的定義格式如下:

[ function ] funname [()]

{

    action;

    [return int;]

}

說明:

  • 1、可以帶function fun() 定義,也可以直接fun() 定義,不帶任何參數。
  • 2、參數返回,可以顯示加:return 返回,如果不加,將以最后一條命令運行結果,作為返回值。 return后跟數值n(0-255)
    下面的例子定義了一個函數并進行調用:
demoFun(){
    echo "這是我的第一個 shell 函數!"
}
echo "-----函數開始執行-----"
demoFun
echo "-----函數執行完畢-----"
Paste_Image.png

下面定義一個帶有return語句的函數:

funWithReturn(){
    echo "這個函數會對輸入的兩個數字進行相加運算..."
    echo "輸入第一個數字: "
    read aNum
    echo "輸入第二個數字: "
    read anotherNum
    echo "兩個數字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和為 $? !"

輸出類似下面:

這個函數會對輸入的兩個數字進行相加運算...
輸入第一個數字: 
1
輸入第二個數字: 
2
兩個數字分別為 1 和 2 !
輸入的兩個數字之和為 3 !

函數返回值在調用該函數后通過 $? 來獲得。
注意:所有函數在使用前必須定義。這意味著必須將函數放在腳本開始部分,直至shell解釋器首次發現它時,才可以使用。調用函數僅使用其函數名即可。
函數參數
在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...
帶參數的函數示例:

funWithParam(){
    echo "第一個參數為 $1 !"
    echo "第二個參數為 $2 !"
    echo "第十個參數為 $10 !"
    echo "第十個參數為 ${10} !"
    echo "第十一個參數為 ${11} !"
    echo "參數總數有 $# 個!"
    echo "作為一個字符串輸出所有參數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

輸出結果:

第一個參數為 1 !
第二個參數為 2 !
第十個參數為 10 !
第十個參數為 34 !
第十一個參數為 73 !
參數總數有 11 個!
作為一個字符串輸出所有參數 1 2 3 4 5 6 7 8 9 34 73 !

注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。
另外,還有幾個特殊字符用來處理參數:

Paste_Image.png

Shell 輸入/輸出重定向
大多數 UNIX 系統命令從你的終端接受輸入并將所產生的輸出發送回??到您的終端。一個命令通常從一個叫標準輸入的地方讀取輸入,默認情況下,這恰好是你的終端。同樣,一個命令通常將其輸出寫入到標準輸出,默認情況下,這也是你的終端。
重定向命令列表如下:

Paste_Image.png

需要注意的是文件描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。
輸出重定向
重定向一般通過在命令間插入特定的符號來實現。特別的,這些符號的語法如下所示:

command1 > file1

上面這個命令執行command1然后將輸出的內容存入file1。
注意任何file1內的已經存在的內容將被新內容替代。如果要將新內容添加在文件末尾,請使用>>操作符。
輸入重定向
和輸出重定向一樣,Unix 命令也可以從文件獲取輸入,語法為:

command1 < file1

這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容。
注意:輸出重定向是大于號(>),輸入重定向是小于號(<)。
重定向深入講解
一般情況下,每個 Unix/Linux 命令運行時都會打開三個文件:

  • 標準輸入文件(stdin):stdin的文件描述符為0,Unix程序默認從stdin讀取數據。
  • 標準輸出文件(stdout):stdout 的文件描述符為1,Unix程序默認向stdout輸出數據。
  • 標準錯誤文件(stderr):stderr的文件描述符為2,Unix程序會向stderr流中寫入錯誤信息。
    默認情況下,command > file 將 stdout 重定向到 file,command < file 將stdin 重定向到 file。
    如果希望 stderr 重定向到 file,可以這樣寫:
$ command 2 > file

如果希望 stderr 追加到 file 文件末尾,可以這樣寫:

$ command 2 >> file

2 表示標準錯誤文件(stderr)。
如果希望將 stdout 和 stderr 合并后重定向到 file,可以這樣寫:

$ command > file 2>&1

或者

$ command >> file 2>&1

如果希望對 stdin 和 stdout 都重定向,可以這樣寫:

$ command < file1 >file2

command 命令將 stdin 重定向到 file1,將 stdout 重定向到 file2。
Here Document
Here Document 是 Shell 中的一種特殊的重定向方式,用來將輸入重定向到一個交互式 Shell 腳本或程序。
它的基本的形式如下:

command << delimiter
    document
delimiter

它的作用是將兩個 delimiter 之間的內容(document) 作為輸入傳遞給 command。
注意:

  • 結尾的delimiter 一定要頂格寫,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 縮進。
  • 開始的delimiter前后的空格會被忽略掉。
    /dev/null 文件
    如果希望執行某個命令,但又不希望在屏幕上顯示輸出結果,那么可以將輸出重定向到 /dev/null:
$ command > /dev/null

/dev/null 是一個特殊的文件,寫入到它的內容都會被丟棄;如果嘗試從該文件讀取內容,那么什么也讀不到。但是 /dev/null 文件非常有用,將命令的輸出重定向到它,會起到"禁止輸出"的效果。
如果希望屏蔽 stdout 和 stderr,可以這樣寫:

$ command > /dev/null 2>&1

注意:0 是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。
Shell 文件包含
和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作為一個獨立的文件。
Shell 文件包含的語法格式如下:

. filename   # 注意點號(.)和文件名中間有一空格

或

source filename

到現在shell的一些基礎知識就弄完了,現在看下起來感覺語言真的有好多相通的,了解了這些shell希望對以后自己的工作還是有幫助的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 為何叫做 shell ? shell prompt(PS1) 與 Carriage Return(CR) 的關系?...
    Zero___閱讀 3,185評論 3 49
  • 基礎 頭文件 #!/bin/bash 或者#!/bin/sh #!約定的標記,如IOS的Import 執行文件時需...
    ZMJun閱讀 1,252評論 1 2
  • 簡介 shell 是類 UNIX 系統的外殼,使用 shell 用于實現人機交互的目的,我們通過它可以與內核之間進...
    noparkinghere閱讀 780評論 0 1
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,237評論 2 33
  • 1.shell既是一種命令語言,又是一種程序設計語言2.Batch批處理,寫一個shell腳本,shell一次把這...
    KevinCool閱讀 535評論 1 1