天天看點

Linux系統Bash(Shell)基礎知識(2)

  關于shell腳本的應用上次已經對一些較基本的内容進行闡述,在此對shell腳本進行更進一步的了解--shell腳本的程式設計。

  在講述shell腳本的程式設計之前,先講述一下關于程式設計語言的概念;

  程式設計語言可分為進階語言,低級語言,機器語言;

  區分的依據是離硬體的遠近,效率進階語言是程式設計語言中最接近人類自然語言的一種語言,轉化成計算機能夠了解的機器語言的效率就低,而低級語言也就是彙編語言,作為較靠近機器語言的語言,轉化成計算機能夠了解的機器語言的效率就高;機器語言作為最接近計算機底層大量實體硬體的語言,為了能讓使用者在使用計算機的時候以非互動式的方式完成某些任務,需要将這些編制成一個檔案,讓計算機順序讀取,進而實作功能;人們利用進階語言,這種比較接近人類的自然語言編寫代碼,進行編譯,轉化成彙編語言,再由編譯器轉換成計算機能夠了解的機器語言去通路在計算機最底層的大量的實體裝置;用下面的路線可表示;

  程式設計語言:

        應用級語言->系統級語言->微碼語言->機器語言

  進階語言:

  ①根據源代碼的處理方式分為:

  編譯運作語言:

          根據進階語言寫出的源代碼,經過編譯器編譯成微碼語言也就是彙編語言,彙編語言再           使用彙編器将彙編語言轉化成二進制代碼即機器語言,計算機再根據機器語言所表達的           内容,将代碼轉化成可以直接執行的二進制檔案。

  解釋運作語言:

          根據進階語言編寫的源程式可以直接啟動跟源代碼對應的解釋器程式,再由解釋器一邊           解釋一邊執行;

  ②根據其程式設計過程中的功能的實作是調用庫還是調用外部程式檔案:

  完整程式設計語言:

          利用庫或程式設計元件進行編輯;

  腳本程式設計語言:

          解釋器,shell腳本,調用shell程式其次調用需要的外部指令檔案,指令解釋器提供了           單一功能的程式設計接口,過程式程式設計邏輯的支援;

  ③根據程式的編寫範式:程式=指令+資料

  過程式程式設計語言:

           以指令為中心,圍繞指令(算法)的實作設計資料和資料結構,資料是要為指令服務            的;

  對象式程式設計語言:

           以資料為中心,将資料執行個體化為類,圍繞着資料的需求來部署指令,類,屬性(描述             某個類中的具體對象),方法;

  Linux的shell程式設計作為一種進階程式設計語言,是個解釋性語言,不需要編譯它有變量,關鍵字和各種順序,選擇,循環的控制語句,如if,else,while,continue,break等語句,也支援函數子產品,有自己的文法結構;

  shell腳本的特點:

  1.shell腳本的編寫都需要在文本文檔中編寫,通過調用目前文本文檔調用shell腳本;

  2.shell腳本是以許多指令的組合,由各種控制語句結合;

  3.“執行幂等性”--任何指令多次執行的結果是一樣的

  注意:很多指令都不具備“執行幂等性”,在shell腳本中就需要使用大量的程式邏輯來判斷某個指令是否滿足其運作條件,以避免在運作過程中出現嚴重錯誤;

  在編寫shell腳本的過程當中,第一行的絕對行首必須是解釋器的路徑即shebang,目前shell腳本的指令的運作需要在哪個解釋器的解釋下運作,解釋器的解釋需要逐條解釋,解釋執行一條指令後才能解釋執行下一條指令;否則會出現解釋錯誤,無法往下執行;解釋器的路徑為“#!”開頭,而在shell腳本中“#”表示目前shell腳本的注釋,注釋必須放在目前行的絕對行首,shell腳本在運作時會忽略這樣的内容;

  例如:

  #!/bin/bash(執行這個檔案,并且用這個檔案去解釋在文本文檔中所有的内容)

  #!/bin/sh

  #!/usr/bin/python

  #!/usr/bin/perl

  # hello(注釋行)

  怎樣編寫shell腳本的内容?

  我們可以利用多種文本編輯器來編寫shell腳本的内容

  如vi,vim,nano,emacs,pico等;

  在次推薦使用vim,vim作為vi的更新版本,功能更加齊全,比vi友善許多,更重要的是,vim在shell腳本編寫的過程中可以使用高亮度的顔色辨別腳本中的變量,關鍵字,控制結構的重要字元,可以在一定程度上檢測shell腳本的正确度;

  shell腳本的運作方法有:

  ①

  直接運作shell腳本的路徑:

  例如

  $./usr/men   //這樣可以直接運作在目前目錄下的文本檔案中的shell腳本内容

  注意:在使用上述方式調用時,必須需為目前shell腳本賦予執行的權限;

  如 chmod u+x 。/usr/men

  ②

  以腳本名作為bash參數,其一般形式是:

  $bash 腳本名 [參數]

  其好處是一個shell腳本可以處理多種情況;

  ③将shell腳本的權限定義為可執行,将其加入到PATH的執行路徑中,直接調用shell腳本名:

  如果要把shell腳本名直接當指令使用,首先要為shell腳本名賦予執行權限,因為shell腳本檔案都是文本檔案,文本檔案預設都不具備執行權限;

  如

  $chmod u+x ex2

  然後将腳本所在的目錄添加到指令搜尋路徑PATH中

  $PATH=$PATH:./ex2

  把目前工作目錄以“.”表示,添加到指令搜尋路徑;這樣就可以直接執行腳本檔案名;

  $ex2

  shell腳本編寫的重要結構:

  多指令執行結構:

  可以實作多條指令的結合,使多條指令共享資源;如“;”,“|”;冒号“;”可以将多條沒有關聯的指令聯合在一起執行,而“|”管道線結構能使上一條指令的輸出資料流,作為下一條指令的輸入資料流,簡單來說,“|”管道線的結構指令之間需要具有某種關聯才可以實作;

  #COMMAND|COMMAND...

  #COMMAND;COMMAND...

  在多指令執行結構中有這幾種結構:

  選擇執行結構:判斷是非正誤,采用“&&”,“||”,“!”的形式;

  邏輯運算:

        與(AND):邏輯乘法&&,作為雙目運算符;他放在兩個邏輯表達式中間,僅當兩個表達式                為真時,結果才為真;

           狀态傳回值:0->success->true

                   1-255->fatlure->false

                   true&&true=true

                   true&&false=false

                   false&&true=false

                   false&&false=false

          “與”的短路邏輯運算,隻要第一個操作數為false,則其邏輯運算的結果一定位false

          COMMAND1&&COMMAND2:如果第一個指令能成功執行,則第二個指令才有必要執行,如果           COMMAND1執行失敗,則COMMAND2無法執行;

        或(OR):邏輯加法||,作為雙目運算符;他放在兩個邏輯表達式中間,其中隻有一個表               達式為真,結果就為真

            true||true=true

            true||false=true

            false||true=true

            false||false=false

            隻要第一個操作數為true則其邏輯運算的結果一定為真;

            COMMAND1||COMMAND2(隻要COMMAND1能夠成功執行,後面的指令可以沒必要執行,隻             有當COMMAND1執行失敗時,COMMAND2才會執行)

        非(!):邏輯取反,!,作為單目運算符;他放在邏輯表達式之前,使原來為真的表達               式變為假,使原來為假的表達式變為真;

            !string:讀取指令曆史空間的内容,在此“!”代表的意義與非無關;

            ! COMMAND:加空格,指令執行狀态的取反

            !COMMAND1&&COMMAND2:相當于COMMAND1||COMMAND2

            如果COMMAND1成功執行則COMMAND2不需要執行;

            如果COMMAND1不能成功執行則COMMAND2需要執行;

            !COMMAND1||COMMAND2:相當于COMMAND1&&COMMAND2

            如果COMMAND1成功執行則COMMAND2會被執行;

            如果COMMAND1不能執行則COMMAND2不會被執行;

            邏輯運算符優先級:

            !>&&>|| 

        異或:比對兩個操作數的相同與否,如果不同則邏輯運算結果為真,如果相同則為假;雙             目運算符;

  本文轉自 wujunqi1996 51CTO部落格,原文連結:http://blog.51cto.com/12480612/1913882