測試培訓方案

程式小霸王發表於2020-10-29

1. 軟體測試基本理論

1.1 軟體生命週期

  1. 問題的定義及規劃
    此階段是軟體開發方與需求方共同討論,主要確定軟體的開發目標及其可行性。
  2. 需求分析
    在確定軟體開發可行的情況下,對軟體需要實現的各個功能進行詳細分析。需求分析階段是一個很重要的階段,這一階段做得好,將為整個軟體開發專案的成功打下良好的基礎。“唯一不變的是變化本身。”,同樣需求也是在整個軟體開發過程中不斷變化和深入的,因此我們必須制定需求變更計劃來應付這種變化,以保護整個專案的順利進行。
  3. 軟體設計
    此階段主要根據需求分析的結果,對整個軟體系統進行設計,如系統框架設計,資料庫設計等等。軟體設計一般分為總體設計和詳細設計。好的軟體設計將為軟體程式編寫打下良好的基礎。
  4. 程式編碼
    此階段是將軟體設計的結果轉換成計算機可執行的程式程式碼。在程式編碼中必須要制定統一,符合標準的編寫規範。以保證程式的可讀性,易維護性,提高程式的執行效率。
  5. 軟體測試
    在軟體設計完成後要經過嚴密的測試,以發現軟體在整個設計過程中存在的問題並加以糾正。整個測試過程分單元測試、組裝測試以及系統測試三個階段進行。測試的方法主要有白盒測試和黑盒測試兩種。在測試過程中需要建立詳細的測試計劃並嚴格按照測試計劃進行測試,以減少測試的隨意性。
  6. 執行維護
    軟體維護是軟體生命週期中持續時間最長的階段。在軟體開發完成並投入使用後,由於多方面的原因,軟體不能繼續適應使用者的要求。要延續軟體的使用壽命,就必須對軟體進行維護。軟體的維護包括糾錯性維護和改進性維護兩個方面。

1.2 軟體生命週期模型

從概念提出的那一刻開始,軟體產品就進入了軟體生命週期。在經歷需求、分析、設計、實現、部署後,軟體將被使用並進入維護階段,直到最後由於缺少維護費用而逐漸消亡。這樣的一個過程,稱為"生命週期模型"(Life Cycle Model)。
典型的幾種生命週期模型包括瀑布模型、快速原型模型、迭代模型。
瀑布模型的特點(文件是主體),很多的問題在最後才會暴露出來。迭代模型比瀑布模型問題暴露的要早;快速原型法比瀑布模型直觀。

1.3 軟體測試概念

廣義概念:指軟體生存週期中所有的檢查、評審和確認工作,其中包括了對分析、設計階段,以及完成開發後維護階段的各類文件、程式碼的審查和確認
狹義概念:識別軟體缺陷的過程,即實際結果與預期結果的不一致

  1. 軟體測試目的
     測試的目的就是發現軟體中的各種缺陷
     測試只能證明軟體存在缺陷,不能證明軟體不存在缺陷
     測試可以使軟體中缺陷降低到一定程度,而不是徹底消滅
     以較少的用例、時間和人力找出軟體中的各種錯誤和缺陷,以確保軟體的質量
  2. 軟體測試原則
     Good-enough: 一種權衡投入/產出比的原則
     保證測試的覆蓋程度,但窮舉測試是不可能的
     所有的測試都應追溯到使用者需求
     越早測試越好,測試過程與開發過程應是相結合的
     測試的規模由小而大,從單元測試到系統測試
     為了儘可能地發現錯誤,應該由獨立的第三方來測試
     不能為了便於測試擅自修改程式
     既應該測試軟體該做什麼也應該測試軟體不該做什麼
  3. 軟體測試的的重點
     測試用例的設計
    – 測試用例的設計是整個軟體測試工作的核心
    – 測試用例反映對被測物件的質量要求,決定對測試物件的質量評估
     測試工作的管理
    – 尤其是對包含多個子系統的大型軟體系統,其測試工作涉及大量人力和物力,有效的測試工作管理是保證有效測試工作的必要前提
     測試環境的建立
    – 測試環境應該與實際測試環境一致

1.4 軟體測試方法

  1. 黑盒測試
     什麼是黑盒測試
    – 又稱功能測試或資料驅動測試,是針對軟體的功能需求/實現進行測試,通過測試來檢測每個功能是否符合需求,不考慮程式內部的邏輯結構
     黑盒測試方法
    – 功能劃分
    – 等價類劃分
    – 邊界值分析
    – 因果圖
    – 錯誤推測等
  2. 什麼是白盒測試
    – 白盒測試也稱結構測試或邏輯驅動測試,必須知道軟體內部工作過程,通過測試來檢測軟體內部是否按照需求、設計正常執行
    – 白盒測試的主要方法
    – 對應於程式的一些主要結構:語句、分支、邏輯路徑、變數;白盒測試的主要方法是:
    – 語句覆蓋方法
    – 分支覆蓋方法
    – 邏輯覆蓋方法
  3. 什麼是動態測試
    動態測試需要在開發/測試環境或實際執行環境中執行軟體,並使用測試用例去查詢軟體缺陷;動態測試包括功能確認與介面測試、覆蓋率分析、效能分析、記憶體分析等
  4. 什麼是靜態測試
    靜態測試不實際執行軟體,主要是對軟體的程式設計格式、結構等方面進行評估.靜態測試包括程式碼檢查、程式結構分析、程式碼質量度量等。它可以由人工進行,也可以藉助軟體工具自動進行
  5. 手工測試和自動測試
    a.手工測試缺點在於測試工作量大,重複多,迴歸測試難以實現
    b.自動測試利用軟體測試工具自動實現全部或部分測試工作:管理、設計、執行和報告;節省大量的測試開銷,並能夠完成一些手工測試無法實現的測試
     手工完成測試的全部過程無法保證測試的科學性與嚴密性:
    – 修改的缺陷越多,迴歸測試越困難
    – 沒有人能向決策層提供精確的資料以度量當前的工作進度及工作效率
    – 反覆測試帶來的倦怠情緒及其他人為因素使得測試標準前後不一
    – 測試花費的時間越長,測試的嚴格性也就越低
     自動測試將測試人員從反覆、煩雜的測試執行中解放出來,用更多的時間進行測試設計和結果分析
     軟體測試不可能完全自動化
     不能完成所有手工測試任務
     無創造性且靈活性差,不能改進測試的有效性
     過程中可能會遇到許多意想不到的問題,特別是當軟體不穩定時
     測試指令碼的維護高

1.5 測試流程

 單元測試
 整合測試
 系統測試
 使用者驗收測試
 迴歸測試
在這裡插入圖片描述
在這裡插入圖片描述

  1. 單元測試
     完成對最小的軟體設計單元—模組的驗證工作
     目標是確保模組被正確地編碼
     使用過程設計描述作為指南,對重要的控制路徑進行測試以發現模組內的錯誤
     通常情況下是面向白盒的
     對程式碼風格和規則、程式設計和結構、業務邏輯等進行靜態測試,及早地發現和解決不易顯現的錯誤
     單元測試的內容
    – 介面測試
    – 內部資料結構
    – 全域性資料結構
    – 邊界
    – 語句覆蓋,錯誤路徑
  2. 14.整合測試
     通過測試發現與模組介面有關的問題
     目標是把通過了單元測試的模組拿來,構造一個在設計中所描述的程式結構
     應當避免一次性的整合(除非軟體規模很小),而採用增量整合
    整合測試主要內容
     API
     API/引數組合
  3. 系統測試
     根據軟體需求規範的要求進行系統測試,確認系統滿足需求的要求
     系統測試人員相當於使用者代言人
     在需求分析階段要確定軟體的可測性,保證有效完成系統測試工作
     系統測試主要內容
     所有功能需求得到滿足
     所有效能需求得到滿足
     其他需求(例如安全性、容錯性、相容性等)得到滿足
  4. 使用者驗收/確認測試
     Alpha測試
    – 是由使用者在開發者的場所來進行的,Alpha測試是在一個受控的環境中進行的
     Beta測試
    – 由軟體的終端使用者在一個或多個使用者場所來進行的,開發者通常不在現場,使用者記錄測試中遇到的問題並報告給開發者
  5. 壓力測試VS效能測試
    效能測試的目的不是去找bugs,而是排除系統的瓶頸,以及為以後的迴歸測試建立一個基準。而效能測試的操作,實際上就是一個非常小心受控的測量分析過程。在理想的情況下,被測軟體在這個時候已經是足夠穩定了。
    效能測試是為了檢查系統的反映,執行速度等效能指標,他的前提是要求在一定負載下,如檢查一個網站在100人同時線上的情況下的效能指標,每個使用者是否都還可以正常的完成操作等。
    概括就是:在不同負載下(負載一定)時,通過一些系統引數(如反應時間等)檢查系統的執行情況;
    壓力測試是為了發現系統能支援的最大負載,他的前提是要求系統效能處在可以接受的範圍內,比如經常規定的葉面3秒鐘內響應;概括就是:在效能可以接受的前提下,測試系統可以支援的最大負載。
    舉例說明:針對一個網站進行測試,模擬10到50個使用者就是在進行常規效能測試,使用者增加到1000乃至上萬就變成了壓力/負載測試。如果同時對系統進行大量的資料查詢操作,就包含了強度測試。

2. Linux入門篇

2.1 Linux作業系統簡介

Linux是一套免費使用和自由傳播的類Unix作業系統,是一個基於POSIX和UNIX的多使用者、多工、支援多執行緒和多CPU的作業系統。它能執行主要的UNIX工具軟體、應用程式和網路協議。它支援32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個效能穩定的多使用者網路作業系統。
1991年的10月5日,Linux創始人林納斯·託瓦茲(Linus Torvalds)在comp.os.minix新聞組上釋出訊息,正式向外宣佈Linux核心的誕生,1994年3月,Linux 1.0釋出,程式碼量17萬行,當時是按照完全自由免費的協議釋出,隨後正式採用GPL(General Public License的縮寫,是一份GNU通用公共授權)協議。
Linux具有如下優點:
 穩定、免費或者花費少
 安全性高
 多工,多使用者
 耗資源少
 由於核心小,所以它可以支援多種電子產品,如:Android手機、PDA等。

2.2 Linux發展趨勢

隨著IT產業的不斷髮展,使用者對網站體驗要求也越來越高,而目前主流網站後端承載系統都是Linux系統,目前Android手機全部基於Linux核心研發。企業大資料、雲端儲存、虛擬化等先進技術都是基於Linux系統。

2.3 Linux系統安裝

在安裝Linux系統之前,先來了解windows系統結構,windows系統一般是安裝在C盤系統盤,同樣Linux也有類似的系統盤(/根分割槽),Linux通常分割槽為(根分割槽/、swap分割槽),Linux系統以檔案的儲存方式,所有的檔案都是儲存在某個目錄下的,類似於windows的資料夾。
對於檔案系統的屬性來說,windows檔案系統型別一般是ntfs、fat32等,而Linux檔案系統型別則為ext2、ext3、ext4等(檔案系統:是作業系統用於明確磁碟或分割槽上的檔案的方法和資料結構,檔案系統由三部分組成:與檔案管理有關軟體、被管理檔案以及實施檔案管理所需資料結構。)
安裝 Linux系統是每一個初學者的第一個門檻。在這個過程中間,最大的困惑莫過於給硬碟進行分割槽。雖然現在各種發行版本的 Linux 已經提供了友好的圖形互動介面,但是很多人還是感覺無從下手。這其中的原因主要是不清楚 Linux 的分割槽規定。就好比如果我們瞭解了windows分割槽的規則,系統盤C、資料盤D等,就很好分割槽了。
在 Linux 中規定,每一個硬碟裝置最多隻能有 4個主分割槽(其中包含擴充套件分割槽)構成,任何一個擴充套件分割槽都要佔用一個主分割槽號碼,也就是在一個硬碟中,主分割槽和擴充套件分割槽一共最多是 4 個。
下面正式來安裝Linux系統,安裝系統前需要準備如下軟體:
 VMware workstation 10.0
 CentOS 5.8 x86_i386.iso
安裝圖解如下:
第一步,新建虛擬機器如下圖:
在這裡插入圖片描述

第二步,選擇相關選項,如下圖:
在這裡插入圖片描述

第三步選擇“稍後安裝作業系統”,如下圖:
在這裡插入圖片描述

第四步,選擇客戶機作業系統型別如下圖:
在這裡插入圖片描述

第五步,設定虛擬機器硬碟大小為20G,最低不能小於5G,如下圖:
在這裡插入圖片描述

第六步,虛擬機器新建完成,如下圖:
在這裡插入圖片描述

第七步,修改虛擬機器記憶體為512M,並新增ISO映象,如下圖:
在這裡插入圖片描述

自此,虛擬機器新建完成,接下來點選“啟動此虛擬機器”進行Linux系統安裝,Linux系統安裝圖解如下:
第一步,進入安裝介面,直接按EnterEnter鍵即可。
在這裡插入圖片描述

第二步,光碟檢測,選擇SKIP跳過。
在這裡插入圖片描述
在這裡插入圖片描述

第三步,選擇安裝過程中的語言,初學者可以選擇“簡體中文”。
在這裡插入圖片描述

第四步,選擇初始化整個硬碟,清除所有資料。
在這裡插入圖片描述

第五步,選擇分割槽方式為“自定義分割槽“。
在這裡插入圖片描述

第五步,點選“新建“-首先建立一個swap交換分割槽,大小為實體記憶體的2倍(1024M)。
在這裡插入圖片描述

第六步,繼續建立分割槽,選擇“新建“,然後建立根分割槽/,如下圖選擇,大小為剩餘所有空間即可。
在這裡插入圖片描述
在這裡插入圖片描述

第七步,預設點選下一步,同時預設DHCP配置,時鐘選擇上海,去掉UTC勾,點選下一步。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

第八步,設定root密碼,至少六位,點選下一步。
在這裡插入圖片描述

第九步,系統安裝包選擇,這裡選擇“現在定製“。
在這裡插入圖片描述

第十步,系統安裝包選擇,左側選擇“開發“----右側選擇”開發工具“和“開發庫”,語言選擇“支援中文“,其他一概不選擇。
在這裡插入圖片描述
在這裡插入圖片描述

安裝完畢會提示“reboot“,直接回車即可。

2.4 Linux學習技巧

初學者可以自己安裝虛擬機器,然後把linux常用命令例如cd、ls、chmod、useradd、vi等等多練習幾十遍,把自己敲打命令的熟練程度提升上來。
然後根據文件搭建Linux下常見的各種服務(DHCP、SAMBA、DNS、Apache、Mysql等),遇到問題後可以在google搜尋,搜尋的時候多看幾篇文章,綜合最好的文章來解決問題。
能夠熟練的搭建服務後,理解每個服務的完整配置和優化,可以擴充思維。例如LAMP,我們一般是把所有服務放在一臺機器上,如果分開多臺該如何部署呢?等等。
平時多積累shell程式設計,可以在網上查詢前輩們寫的非常好的shell,自己下載下來多練習幾遍,從中吸取,不斷提高。
建立一個自己的學習部落格,把平時工作學習中的知識都記錄在裡面,這樣也可以供別人來參考同時也能提高自己的編寫文件及方案的能力。
通過以上學習能夠滿足企業的一般應有,需要達到資深級別,還需要深入學習叢集架構、負載均衡、自動化運維、運維開發等知識。最後還是一句話:多練習才是硬道理!實踐出真知!

3. Linux系統篇

3.1 Linux目錄初識

通過前面的學習,我們已經能夠獨立安裝完一個linux系統,那接下來我們來熟悉一下Linux系統裡面的各個目錄資料夾的大致功能:
主要的目錄樹的有/、/root、/home、/usr、/bin等目錄。下面是一個典型的linux目錄結構如下: (附圖表)
在這裡插入圖片描述

/ 根目錄
/bin 存放必要的命令
/boot 存放核心以及啟動所需的檔案
/dev 存放裝置檔案
/etc 存放系統配置檔案
/home 普通使用者的宿主目錄,使用者資料存放在其主目錄中
/lib 存放必要的執行庫
/mnt 存放臨時的對映檔案系統,通常用來掛載使用。
/proc 存放儲存程式和系統資訊
/root 超級使用者的主目錄
/sbin 存放系統管理程式
/tmp 存放臨時檔案
/usr 存放應用程式,命令程式檔案、程式庫、手冊和其它文件。
/var 系統預設日誌存放目錄

3.2 Linux常用命令

預設進入系統,我們會看到這樣的字元: [root@localhost ~]#,其中#代表當前是root使用者登入,如果是$表示當前為普通使用者。
我們瞭解linux由很多目錄檔案構成,那我們來學習第一個Linux命令:
cd命令, cd /home ;解析:進入/home目錄
cd /root 進入/root目錄 ;cd …/返回上一級目錄;cd ./當前目錄;(.和…可以理解為相對路徑;例如cd /hom/test ,cd加完整的路徑,可以理解為絕對路徑)
接下來繼續學習更多的命令:
ls ./ 檢視當前目錄所有的檔案和目錄。
ls -a 檢視所有的檔案,包括隱藏檔案,以.開頭的檔案。

pwd顯示當前所在的目錄。
mkdir建立目錄,用法mkdir test ,命令後接目錄的名稱。
rmdir 刪除空目錄
rm 刪除檔案或者目錄,用法 rm –rf test.txt (-r表示遞迴,-f表示強制)。
cp 拷貝檔案,用法,cp old.txt /tmp/new.txt ,常用來備份;如果拷貝目錄
需要加 –r引數。

mv 重新命名或者移動檔案或者目錄,用法, mv old.txt new.txt
touch 建立檔案,用法,touch test.txt,如果檔案存在,則表示修改當前檔案時間。
Useradd建立使用者,用法 useradd wugk ,userdel刪除使用者。
Groupadd建立組,用法 groupadd wugk1 ,groupdel刪除組。

find查詢檔案或目錄,用法 find /home -name “test.txt”,命令格式為:
find 後接查詢的目錄,-name指定需要查詢的檔名稱,名稱可以使用表示所有。
find /home -name “
.txt” ;查詢/home目錄下,所有以.txt結尾的檔案或者目錄。
vi 修改某個檔案,vi有三種模式:
命令列模式、文字輸入模式、末行模式。
預設vi開啟一個檔案,首先是命令列模式,然後按i進入文字輸入模式,可以在檔案裡寫入字元等等資訊。
寫完後,按esc進入命令模式,然後輸入:進入末行模式,例如輸入:wq表示儲存退出。
如果想直接退出,不儲存,可以執行:q!, q!歎號表示強制退出。
cat 檢視檔案內容,用法 cat test.txt 可以看到test.txt內容
more 檢視檔案內容,分頁檢視,cat是全部檢視,如果篇幅很多,只能看到最後的篇幅。可以使用cat和more同時使用,例如: cat test.txt |more 分頁顯示text內容,|符號是管道符,用於把|前的輸出作為後面命令的輸入。
echo 回顯,用法 echo ok,會顯示ok,輸入什麼就列印什麼。
echo ok > test.txt ;把ok字元覆蓋test.txt內容,>表示追加並覆蓋的意思。>>兩個大於符號,表示追加,echo ok >> test.txt,表示向test.txt檔案追加OK字元,不覆蓋原檔案裡的內容。
初學者常見的命令就如上所示,當然還有很多深入的命令需要學習,後面的附件會講解。

3.3 Linux使用者許可權

在Linux作業系統中,root的許可權是最高的,相當於windows的administrator,擁有最高許可權,能執行任何命令和操作。在系統中,通過UID來區分使用者的許可權級別,UID等於0,表示此使用者具有最高許可權,也就是管理員。其他的使用者UID依次增加,通過/etc/passwd使用者密碼檔案可以檢視到每個使用者的獨立的UID。
每一個檔案或者目錄的許可權,都包含一個使用者許可權、一個組的許可權、其他人許可權,例如下:
標紅第一個root表示該檔案所有者是root使用者,第二個root代表該檔案的所屬的組為root組,其他使用者這裡預設不標出。
[root@node1 ~]# ls -l monitor_log.sh
-rw-r–r-- 1 root root 91 May 7 20:21 monitor_log.sh
[root@node1 ~]#
如果我們想改變某個檔案的所有者或者所屬的組,可以使用命令chown
chown –R test:test monitor_log.sh即可。
每個Linux檔案具有四種訪問許可權:可讀®、可寫(w)、可執行(x)和無許可權(-)。
利用ls -l命令可以看到某個檔案或目錄的許可權,它以顯示資料的第一個欄位為
準。第一個欄位由10個字元組成,如下:
[root@node1 ~]# ls -l monitor_log.sh
-rw-r–r-- 1 root root 91 May 7 20:21 monitor_log.sh
[root@node1 ~]#
第一位表示檔案型別,-表示檔案,d表示目錄;後面每三位為一組。
第一組:2-4位表示檔案所有者的許可權,即使用者user許可權,簡稱u
第二組:5-7位表示檔案所有者所屬組成員的許可權,group許可權,簡稱g
第三組:8-10位表示所有者所屬組之外的使用者的許可權,other許可權,簡稱o
從上面這個檔案,我們可以看出,monito_log.sh檔案對應的許可權為:
root使用者具有讀和寫的許可權,root組具有讀的許可權,其他人具有讀的許可權。
為了能更簡單快捷的使用和熟悉許可權,rwx許可權可以用數字來表示,分別表示為r(4)、w(2)、x(1)。
Monitor_log.sh許可權可以表示為:644
如果給某個檔案授權,命令為chmod:chmod 777 monitor_log.sh

3.4 Linux網路配置

熟悉了常用的命令和Linux許可權,那接下來如何讓所在的Linux系統上網呢?管理linux伺服器網路有哪些命令呢?
Linux伺服器預設網路卡配置檔案在/etc/sysconfig/network-scripts/下,命名的名稱一般為:ifcfg-eth0 ifcfg-eth1 ,eth0表示第一塊網路卡,eth1表示第二塊網路卡,依次類推。一般DELL R720標配有4塊千兆網路卡。
修改網路卡的IP,可以使用命令: vi /etc/sysconfig/network-scripts/ifcfg-eth0 如果是DHCP獲取的IP,預設配置如下:

Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]

DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:0c:29:52:c7:4e
ONBOOT=yes
TYPE=Ethernet

如果是靜態配置的IP,ifcfg-eth0網路卡配置內容如下:

Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]

DEVICE=eth0
BOOTPROTO=static
HWADDR=00:0c:29:52:c7:4e
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.33.10
NETMASK=255.255.255.0
GATEWAY=192.168.33.1
網路卡引數詳解如下:
DEVICE=eth0   #物理裝置名
ONBOOT=yes   # [yes|no](重啟網路卡是否啟用裝置)
BOOTPROTO=static #[none|static|bootp|dhcp](不使用協議|靜態分配|BOOTP協議|DHCP協議)
TYPE=Ethernet  #網路卡型別
IPADDR=192.168.33.10 #IP 地址
NETMASK=255.255.255.0 #子網掩碼
GATEWAY=192.168.33.1 #閘道器地址

網路卡配置完畢,重啟網路卡,命令: /etc/init.d/network restart 即可。
檢視ip命令:ifconfig 檢視當前伺服器所有網路卡的IP,可以單獨指定,ifconfig eth0 檢視eth0的IP地址。
網路卡配置完畢,如果來配置DNS,首先要知道DNS配置在哪個目錄檔案下,vi /etc/resolv.conf 檔案:
在該檔案裡面新增如下兩條:
nameserver 202.106.0.20
nameserver 8.8.8.8
從上到下,分別表示主DNS,備DNS。配置完畢後,不需要重啟網路卡,DNS立即生效。
可以ping www.baidu.com 看看效果:
在這裡插入圖片描述

IP配置完畢後,我們可以通過遠端工具來連線Linux伺服器,常見的Linux遠端連線工具有:putty、secureCRT(主流)、xshell、xmanger等工具。
下載安裝secureCRT,開啟工具,然後如圖配置:
點選左上角quick connect快速連線,彈出介面,然後輸入IP,使用者名稱,埠預設是22,然後點選下方的connect連線,會提示輸入密碼,輸入即可。
在這裡插入圖片描述

彈出輸入密碼框:
在這裡插入圖片描述

進入遠端介面,與伺服器真實登入一樣,然後可以執行命令:
在這裡插入圖片描述

通過這幾章的學習,我們已經熟練了Linux常用命令的操作,許可權網路、網路配置、遠端連線等知識,那接下來我們還能做什麼呢?我們已經差不多入門了,接下來就是更進一步的服務配置,Linux系統到底用來做什麼呢?接下來的章節將跟大家一起來學習。
Linux系統的應用,我們最開始介紹的時候簡單介紹過,目前大中型企業都用它來承載web網站、資料庫、虛擬化平臺等,那接下來我們將在Linux系統安裝各種服務和軟體來實現Linux真正的價值。

4. Linux程式設計篇

4.1 Shell程式設計簡介

shell是作業系統的最外層。shell合併程式語言以控制程式和檔案,以及啟動和控制其它程式。shell 通過提示您輸入,向作業系統解釋該輸入,然後處理來自作業系統的任何結果輸出來管理您與作業系統之間的互動。
Shell是使用者與Linux作業系統之間溝通的橋樑。使用者可以輸入命令執行,又可以利用 Shell指令碼程式設計去執行。隨著Linux企業應用越來越多,維護Linux日常工作頻繁,所以如果單靠手工去敲打命令是非常困難的,所以學會熟練使用SHELL程式設計是每個Linux SA必備的功課。
Linux Shell種類非常多,常見的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell語言的語法有所不同,所以不能交換使用。
最常用的shell是Bash,也就是Bourne Again Shell,由於易用和免費,Bash在日常工作中被廣泛使用,也是大多數Linux系統預設的Shell。接下來我們來寫一個簡單的shell指令碼。(shell指令碼一般檔名以.sh結尾,同時檔案第一行定義該指令碼為shell指令碼)

vi  first_shell.sh
#!/bin/bash
#This is my First shell
echo  “Hello  World !

這就是我們的第一個指令碼,是不是很簡單呢,註解如下:
#!/bin/bash //表示定義該指令碼是一個shell指令碼(固定格式)。
#This is my First shell //這裡的#號屬於註解,沒有任何的意義,SHELL不會解析它。
echo “Hello World !” //shell指令碼主命令,我們執行這個指令碼講看到: Hello World ! 資訊。
指令碼編寫完畢,如何來執行呢,首先執行shell指令碼需要執行許可權,賦予執行許可權:
chmod o+x first_shell.sh 然後./first_shell.sh執行即可;也可以直接使用命令執行: /bin/sh first_shell.sh,顯示效果一樣。

4.2 Shell變數設定

Shell程式語言是非型別的解釋型語言,不像C++/JAVA語言程式設計時需要事先宣告變數,SHELL給一個變數賦值,實際上就是定義了變數,在Linux支援的所有shell中,都可以用賦值符號(=)為變數賦值。
SHELL變數可分為兩類:區域性變數和環境變數。區域性變數只在建立它們的shell指令碼中使用。而環境變數則可以在建立它們的shell及其派生出來的任意子程式中使用。有些變數是使用者建立的,其他的則是專用shell變數。
例如在指令碼里面定義A=123 ,定義這樣一個變數,前面變數名,後面是變數的值。
引用變數可以使用$A,把變數放在指令碼里面會出現什麼樣的效果呢?如下:

#!/bin/bash
#Author wugk 2014-06-10
A=123
echo  “Printf variables equal is $A

執行指令碼:sh test.sh,結果將會顯示:
Printf variables equal is 123
簡單的理解變數,相當於定義一個別名-名稱,引用的時候加上$符號就可以了。
例如定義變數 name=wuguangke
執行echo $name 將會顯示wuguangke
SHELL常見的系統變數解析:
$0 當前程式的名稱
$n 當前程式的第n個引數,n=1,2,…9
$* 當前程式的所有引數(不包括程式本身)
$# 當前程式的引數個數(不包括程式本身)
$? 命令或程式執行完後的狀態,一般返回0表示執行成功。
$UID 當前使用者的ID
$PWD 當前所在的目錄

4.3 Shell流程控制語句

在Linux Shell程式設計中,if、for、while、case等條件流程控制語句用的非常多,把這些學好,對提升指令碼的功力有非常大的幫助。下面將逐個來講解具體的用法:
 If條件判斷語句

If  (表示式)  #if ( Variable in Array )
語句1
else
語句2
fi

案例一,測試數字大小

#!/bin/sh
NUM=100
if (( $NUM > 4 )) ;then 
echo “this num is $NUM greater  4 !fi

案例二,測試目錄是否存在,不存在則新建(注意,中括號之間必須要空格)

#!/bin/sh
#judge dir exist
if  [  !  -d  /data/20140515 ];then 
mkdir  -p /data/20140515
 else
	echo  “This DIR is exist,Please exit..fi

邏輯運算子解析:
-f 判斷檔案是否存在 eg: if [ -f filename ]
-d 判斷目錄是否存在 eg: if [ -d dir ]
-eq 等於 應用於:整型比較
-ne 不等於 應用於:整型比較
-lt 小於 應用於:整型比較
-gt 大於 應用於:整型比較
-le 小於或等於 應用於:整型比較
-ge 大於或等於 應用於:整型比較
-a 雙方都成立(and) 邏輯表示式 –a 邏輯表示式
-o 單方成立(or) 邏輯表示式 –o 邏輯表示式
-z 空字串

案例三,多個條件測試判斷

#!/bin/sh
scores=80;
if  [[ $scores -gt 85 ]]; then
    echo "very good!";
elif [[ $scores -gt 75 ]]; then
    echo "good!";
elif [[ $scores -gt 60 ]]; then
    echo "pass!";
else
    echo "no pass!";
fi;

 迴圈語句for

For 變數 in 字串

do

語句1

done

案例一,列印seq多個數

#!/bin/sh
	for   i   in  `seq 15`
	do
		echo  “NUM is $idone

案例二,找到相關log,然後批量打包

#!/bin/sh
	for   i   in  `find /var/log  -name “*.log”`
	do
		tar –czf  2014log.tgz $i
	done

 迴圈語句while

while 條件語句

do

語句1

done

案例一,while條件判斷數字

#!/bin/sh
i=1;
while [[ $i -lt 10 ]];do
    echo $i;
    ((i++));
done;

案例二,while逐行讀取某個檔案

#!/bin/sh
while read line
do
    echo  $line;
done  < /etc/hosts

 Until迴圈語句

until 條件	
do
action
done

直到滿足條件,才退出。否則執行action。
案例一,條件判斷數字

#!/bin/sh
a=10;
until [[ $a -lt 0 ]];do
echo $a;
((a--));
done;	

 Case選擇語句

case $arg in  
    pattern1)
    語句1 
    ;;  
    pattern2)
    語句2
    ;;  
    *)
    語句3
    ;;  
esac

案例一,建立選擇引數指令碼

#!/bin/sh
case $1 in

        monitor_log)
        monitor_log
        ;;
        archive_log)
        archive_log
        ;;

        *          )
        echo "Usage:{$0 monitor_log | archive_log |help }"
        ;;
esac

 select選擇語句

#!/bin/sh
PS3="What you like most of the open source system?"
select i in CentOS RedHat Ubuntu 
do
echo "Your Select System: "$i
done

4.4 Shell指令碼案例

a) 自動刪除test.txt檔案指令碼
指令碼的功能實現從/root/目錄cp拷貝test.txt到/tmp目錄,並且在/tmp目錄建立一個目錄abc,並且刪除原/root/下test.txt。
首先命名指令碼名稱為auto_cp.sh(名稱可以自己定義),內容如下:

#!/bin/bash
#This is First shell for auto cp Files
#定義檔案和目錄變數
FILES=/root/test.txt
DIR=/tmp
cp   $FILES  $DIR  
cd   $DIR ; mkdir –p abc 
rm 	 -rf  $FILES
echo  “The Shell Scripts exec successfully !

“自動CP並刪除檔案”的指令碼編寫完畢,儲存退出即可。
b) 自動備份Mysql資料庫指令碼

#!/bin/sh 
#auto backup mysql 
#wugk  2012-12-12 
#Define PATH定義變數
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d`
MYSQLDB=webapp
MYSQLPW=backup
MYSQLUSR=backup
#must use root user run scripts 必須使用root使用者執行,$UID為系統變數
if	
   [ $UID -ne 0 ];then
   echo This script must use the root user ! ! ! 
   sleep 2
   exit 0
fi
#Define DIR and mkdir DIR 判斷目錄是否存在,不存在則新建
if
   [ ! -d $BAKDIR ];then
   mkdir -p $BAKDIR
else
   echo This is $BAKDIR exists.... 
fi
#Use mysqldump backup mysql 使用mysqldump備份資料庫
/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW -d $MYSQLDB >$BAKDIR/webapp_db.sql
echo "The mysql backup successfully "

c) 自動打包tar目錄下log檔案指令碼

#!/bin/sh
#auto tar czf shell to Files 
#Author wugk 2014-05-15
SRC_DIR=/opt/
DES_DIR=/opt/backup/`date +%Y%m%d`

If 
[ ! –d  $DES_DIR ];then
	Mkdir –p $DES_DIR
fi
for  i  in  `find  $SRC_DIR  -name “*.log”`
do
	tar  czf  $i.tgz  $i 
done
echo “The scripts exec end, Files tar successfully !

d) 自動拒絕惡意IP指令碼

#!/bin/sh
#auto drop ssh failed IP address
#wugk 2013-1-2
#定義變數
SEC_FILE=/var/log/secure
#如下為擷取secure檔案惡意ip 遠端登入22埠,大於等於4次就寫入防火牆,禁止以後再登入伺服器的22埠
IP_ADDR=`tail -n 1000 /var/log/secure |grep "Failed password"| egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}" | sort -nr | uniq -c |awk ' $1>=4 {print $2}'`
IPTABLE_CONF=/etc/sysconfig/iptables
echo
cat <<EOF
++++++++++++++welcome to use ssh login drop failed ip+++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++------------------------------------++++++++++++++++++
EOF
echo -n "請等待5秒後開始執行 "
for ((j=0;j<=4;j++)) ;do echo -n "----------";sleep 1 ;done
echo
for i in `echo $IP_ADDR`
do
    #檢視iptables配置檔案是否含有提取的IP資訊
    cat $IPTABLE_CONF |grep $i >/dev/null
if
    [ $? -ne 0 ];then
    #判斷iptables配置檔案裡面是否存在已拒絕的ip,如何不存在就不再新增相應條目
    sed -i "/lo/a -A INPUT -s $i -m state --state NEW -m tcp -p tcp --dport 22 -j DROP" $IPTABLE_CONF
else
    #如何存在的話,就列印提示資訊即可
    echo  "This is $i is exist in iptables,please exit ......"
fi
done

#最後重啟iptables生效

/etc/init.d/iptables restart

4.5 Shell陣列程式設計

陣列,就是相同資料型別的元素按一定順序排列的集合,就是把有限個型別相同的變數用一個名字命名,然後用編號區分他們的變數的集合,這個名字成為陣列名,編號成為下標。
在這裡插入圖片描述

今天這裡我們來探討一維陣列的定義、統計、引用和刪除等操作。首先來定義一個一維陣列:
A=( test1 test2 test3 ) ,定義陣列一般以括號的方式來定義,陣列的值可以隨機定義。如何來引用呢?
echo ${A[0]},代表引用第一個陣列變數,結果會顯示test1,陣列引用從0開始,代表第一個陣列,依次類推。
echo ${A[1]},代表引用第二個陣列變數,結果會顯示test2,陣列引用也是從0開始計算的。
如何顯示該陣列所有引數呢?echo ${A[@]} 將顯示所有引數test1 test2 test3 。
如何顯示該陣列引數個數呢?echo ${#A[@]} 將顯示該陣列的引數個數3。
如果替換某個陣列呢?例如替換第二個test2陣列為test5:echo ${A[@]/test2/test5}
如何刪除一個陣列呢?例如刪除test3陣列命令為:unset A[2] ;echo ${A[@]}檢視效果。

那輸入如何在程式設計來使用呢?請看下面例子:

#!/bin/sh
#Auto Make KVM Virtualization
#Auto config bond scripts
eth_bond()
{
NETWORK=(
  HWADDR=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $1}'`
  IPADDR=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $2}'`
  NETMASK=`ifconfig eth0 |egrep "HWaddr|Bcast" |tr "\n" " "|awk '{print $5,$7,$NF}'|sed -e 's/addr://g' -e 's/Mask://g'|awk '{print $3}'`
  GATEWAY=`route -n|grep "UG"|awk '{print $2}'`
)
cat >ifcfg-bond0<<EOF
DEVICE=bond0
BOOTPROTO=static
${NETWORK[1]}
${NETWORK[2]}
${NETWORK[3]}
ONBOOT=yes
TYPE=Ethernet
NM_CONTROLLED=no
EOF

如上指令碼為定義三個陣列變數,然後分別來引用,這樣讓指令碼可讀性更強,更整潔。關於陣列就簡單的介紹到這裡。

相關文章