http://blog.51cto.com/zt/267
原創作品,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本聲明。否則將追究法律責任。http://johnwang.blog.51cto.com/474770/326073
shell簡介 shell處於kernel的外層,用來負責接收使用者輸入的命令,然後將命令解釋成kernel能瞭解的方式,然後由kernel去執行,再將結果傳回預設的輸出周邊。shell是一種命令直譯器,同時也是一個程式語言。shell有很多種,在眾多的Linux發行版中,標準的shell是bash,也是我們學習的主要對象。 第一個程式 範例:hello.sh #!/bin/bash echo 'Hello World' 執行之前,給予執行許可權: chmod +x hello.sh 執行: ./hello.sh 輸出: Hello World 這樣第一個shell指令碼就成功的運行了。
基礎概念部分 登陸主機 登陸主機分為本地登陸和遠程登陸。 本地登陸:就是直接面對主機,由鍵盤輸入使用者密碼登陸,使用tty1-tty6,或者圖形介面tty7 遠程登陸:通過網路連接主機,以虛擬終端的方式登陸,使用ssh 退出登陸 1.使用命令exit 2.使用【Crtl+D】退出 檔案 在Linux中,任何東西包括硬體都視為檔案。檔案可以分為幾種: 一般檔案:純文字檔案,二進位檔案。如果檔案具有執行許可權,稱為執行檔案。 目錄:包含檔案。 裝置檔案:字元檔案,磁碟檔案。 內部進程通訊檔案:socket檔案,串連檔案(pipe、fifo)兩種。 特殊檔案:符號連結檔案,soft link或者symbolic link 隱藏檔案:檔案名稱的第一個字元是一個點(.) 常見檔案代碼: - 一般檔案 d 目錄 l 符號連結檔案 b 塊檔案 c 字元檔案 s socket檔案 p 管道檔案 目錄 目錄也是檔案的一種,目錄中可以包含子目錄和檔案。 萬用字元 萬用字元是指一種檔案名稱的樣式,可用來對比檔案名稱,以找到相符的檔案。 * 代表任意的字串,可以是Null 字元串 ? 代表一個字元,但不可以為空白 轉義符 反斜線 \ 是逸出字元,也叫做“逃逸字元”,目的在於使後接的字元回複原來作為單純字元的用途。 字元集合 [abc] 代表a,b,c中任意的一個字元 [a-z] 代表a到z中的任意一個字元,小寫英文字母 [A-Z] 代表大寫英文字母 [A-Za-z] 代表字母 [0-9] 代表數字 [a-z_-] 代表任意一個小寫英文字母,_ 或者 - [!0-9] 代表非數字 [0-9!] 代表數字或驚嘆號 [\!0-9] 代表數字或驚嘆號 括弧擴充 {g,nc,s}ftp 代表gftp ncftp sftp
shell程式的基本組成結構 shell結構大體是由設定變數、內建命令、shell的文法結構、函數組成。 使用執行個體說明:test.sh #!/bin/bash #說明使用/bin/bash作為這個指令碼的解譯器 #定義一個函數 function my_fun () { echo "Hello, $1,today is $2" } #定義連個變數 name=$1 today=`date` #函數調用 my_fun "$name" "$today" 上面的這個指令碼要想運行還需要做一些操作,首先給予執行許可權 chmod +x test.sh 然後執行 ./test.sh john 輸出 Hello, john,today is Tue Jun 1 14:51:46 CST 2010 父shell和子shell 在執行script之前,身處的環境就是父shell。執行script之時,父shell根據#!/bin/bash,fork出來一個新的shell環境,然後在子shell中執行,執行完畢後子shell結束,任然回到父shell中,這樣不會影響到父shell的環境。 login shell 和non-login shell 這張圖片是login shell的流程,當是non-login shell時,只執行方框中的標註的部分。由這張圖我們可以知道,在如下幾種情況下,執行的流程。 登陸(login) /etc/profile ~/.bash_profile 登出(logout) ~/.bash_logout 執行新shell,分成兩種情況 1.執行互動shell ~/.bashrc /etc/bashrc 2.執行非互動shell,比如執行script 會檢查 BASH_ENV 變數的內容,如果有定義,則執行
變數 變數是暫時用來儲存資料的地方,是一個記憶體空間。bash shell和其他的程式設計語言,沒有“資料形態”,也就是說預設情況下不區分一個變數是整型還是浮點型等,除非你使用declare語句申明變數類型。在bash shell中,預設只有一種資料型,就是由字元組成的字串。同時,設定的變數只在當前的shell中存在,也就是,每一個shell都會維護一份他們自己的變數,彼此不會有影響。可以把變數匯出成環境變數,這樣其他的shell就可以被子shell引用。 變數的命名規則: 1.可以使用英文字母、數字和底線組成 2.第一個字元不能是數字 3.區分大小寫 變數設定: 變數名=值 例如:name=john 建議這樣設定變數:name="john" 或者name='john' 在引用變數的時候使用雙引號和單引號是有區別的,單引號不會進行變數替換。而在雙引號中,如果也想抑制變數替換,則需要使用轉義符反斜線 \ 引用變數: $變數名 建議這樣引用變數:${變數名} 環境變數: 使用下面的任意一個方法可以使name變為環境變數 1.name="john" export name 2.export name="john" 3.declare -x name="john" bash的一些重要的內建變數: $1 ~ $n 參數位置。當n超過9後,使用${n},例如${10} $* 代表所有的參數位置,而且視為一個字串 $@ 代表所有的參數位置,但是代表各位置參數組成的串列 $# 參數的個數 $? 上一個命令的傳回值 $! 上一個後台進程的編號 $$ 目前shell的進程編號
進階變數 進階變數中的3個主題: 變數擴充:${變數名} 命令替換:$(命令) 算術擴充:$((算術式)) 測試變數存在與否R=${name-'john'},如果name不存在,則“傳回”預設值。 測試變數不存在或者為空白置R=${name:-'john'} ,如果name不存在或者存在但為空白,則“傳回”預設值。 測試變數不存在或值為空白,則給變數一個預設值R=${count:=100} 測試變數不存在或值為空白,則提示出錯訊息${變數名:?提示訊息}
算術運算 歸納為5種方法 1.算術擴充,例如R=$((1+1)) 2.使用外部程式expr,例如R=`expr 1+1` 3.使用$[],例如R=[1+1] 4.使用命令declare,例如declare -i R=1+1 5.使用命令let,例如let R=1+1
流程式控制制 if-then if 條件; then 動作 fi