bash腳本編程與正則表達式

一、bash特性之多命令執行的邏輯關係

    1.命令替換

    COMMAND1 $(COMMAND2)


    2.管道

    COMMAND1 | COMMAND2 | COMMAND3


    3.順序執行結構

    COMMAND1 ; COMMAND2 ; COMMAND3


    4.選擇執行結構:

    如果...要麼...

    要麼...要麼...

    邏輯運算:

        與:邏輯乘,&&,雙目操作符(對兩個邏輯值進行操作)

        或:邏輯加,||

            非:邏輯取反,!,單目操作


    命令的執行狀態返回值:

        SUCCESS:0

        FAILURE:1~255


    COMMAND1 && COMMAND2 

        "與"運算的短路運算法則,只要第一個操作數爲false,則其邏輯運算結果一定爲false

表示如果COMMAND1能夠成功執行,那麼將會執行COMMAND2,如果失敗則不執行


    COMMAND1 || COMMAND2

        "或"運算的短路運算法則,只要一個操作數爲true,則其邏輯運算結果一定爲true

    只有COMMAND1執行失敗,那麼將會執行COMMAND2


    !COMMAND1


        運算優先級:!>&&>||


二、bash腳本編程:

    高級語言:

按照源代碼處理方式分類:

    編譯型語言

源代碼 → 編譯器(編譯) → [鏈接器(做鏈接)] →彙編器(彙編) → 可以執行的二進制代碼文件

    解釋型語言

源代碼 → 解釋器(逐行解釋) → 邊解釋邊執行


根據編程過程中的功能實現是調用庫還是調用外部程序來分類

    完整編程語言

利用編程庫或者組件進行編程

    腳本編程語言

利用解釋器調用被選擇的應用程序


根據程序的編寫規範分類:

    過程式語言

程序=指令+數據

以指令爲中心,圍繞指令的功能實現設計數據和數據結構,數據爲指令服務

算法和指令的實現形式:

    順序執行

    選擇執行

    循環執行

    面嚮對象語言

程序=算法+數據結構

            以數據和數據結構爲中心,將數據實例化,圍繞數據的需求來部署算法

類:被實例化的數據

屬性:同一類中的不同對象的區分依據

方法:類的正確操作方法


    低級語言:彙編語言

    機器語言:二進制語言


    shell腳本編程——bash腳本編程:

過程式編程語言,解釋運行的編程語言,腳本類語言(依靠外部應用程序文件運行)


    shell腳本是什麼?

1.純文本文檔——文件中所有存儲或包含的指令+數據都是以字符爲單位進行存儲的

2.根據用戶的需求來解決用戶問題的簡單或複雜的命令組合體

3.是一種具有執行冪等性的程序實體

    執行冪等性:任何命令的一次執行結果和多次執行結果是一致的

            很多的命令都不具備執行冪等性,因此在shell腳本中需要使用大量的程序邏輯來判斷某個命令是否符合其運行條件,從而避免在運行過程中出現的大量嚴重錯誤


    shell腳本中的代碼內容如何書寫?

1.首行必須是shebang,即:解釋器程序的絕對路徑,必須佔據絕對行首且必須單獨佔據第一行;在執行腳本時,會根據sheban的指示,啓動相應的解釋器以解釋腳本諸多的命令:

    #!/bin/bash

    #!/bin/sh

    #!/user/bin/python


2.在shell腳本中,除了shebang之外,所有行首爲#字符的行,均被解釋爲註釋行;

    即:解釋器只會解釋其內容,但並不予以執行


        3.解釋器會忽略腳本文件中所有的空白行,空白行指的是:在一行文本中,除了空白字符,空格字符,製表符之外不具備其他任何類型字符的行:


4.大量的命令和關鍵字

    命令:內部或外部應用程序

    關鍵字:內置於shell,只能在某種特定結構體中執行的命令:keyword

比如if,else,then,do,while等等


5.shell中的所有的特殊功能字符;

            質疑:所有被編寫進shell腳本文檔的字符必須是ASCII編碼格式的字符,其他編碼格式的字符可以出現在shell腳本中,但不具有任何特殊意義


6.如何編寫shell腳本?

    可以利用所有的文本文檔編輯工具進行shell腳本編寫,如:nano,vi,vim,pico,emacs

    通常在linux的各發行版本中,推薦使用vim



    腳本文件的命名方式

一般情況下會爲腳本設置".sh"的後綴;較低版本的編輯工具會根據文件的後綴名稱來識別是否爲shell腳本文件;較高版本的文本編輯工具,如vim7,無需過多的關心文件後綴名的問題


    腳本的運行方式:

        1.爲腳本文件賦予執行權限,可以直接以絕對路徑或相對路徑的方式運行此文件:

    # chmod +x /PATH/TO/SOME_SCRIPT_FILE

    # /PATH/TO/SOME_SCRIPT_FILE

    注意:如果腳本文件所在目錄路徑儲存於PATH變量中,則直接以腳本文件名來執行即可


2.直接使用解釋器運行腳本,將腳本文件作爲解釋器程序的參數

    # bash /PATH/TO/SOME_SCRIPT_FILE

-x  使bash在解釋腳本的過程展示在標準輸出上;一般用於爲shell腳本排錯

-n  對腳本文件進行預執行,以分析腳本中是否存在與語法類錯誤;如果沒有錯誤,則不輸出任何信息;相反,則輸出簡潔的提示信息;具體的錯誤定位需要自己判斷

注意:此種方式中,腳本文件是否有執行權限並不是很重要的屬性


注意:以上兩種方式,在執行腳本時,會在當前shell中開啓一個新的子shell以運行腳本;一般情況下,當腳本運行結束,該子shell也會被隨之銷燬;因此,所有在腳本中定義的變量,在腳本的末尾處,最好將其明確的撤銷


3.使用source命令運行腳本;

    # source /PATH/TO/SOME_SCRIPT_FILE

    # . /PATH/TO/SOME_SCRIPT_FILE

            注意:

1.source命令不會再運行腳本時開啓子shell,而是在當前shell中運行;

2.使用source命令運行腳本


    利用bash腳本程序實現算數運算

常用的基本算數運算符:

            +,-,*,/,%,**


增強型算術運算符:

    +=,-=,*=,/=,%=


特殊的增強型算數運算符:

    ++,--


    算數運算方法:

1.$[expression]

    其中的表達式可以是純數字組成,也可以使用變量引用變量值;在使用變量時,可以將$省略

                示例:

    #echo $[3+4]

    #NUM1=5;NUM2=4;echo[NUM1*NUM2]


2.let VAR=EXPRESSION

    根據算數表達式完成算術運算並賦值給指定的變量


3.$((EXPRESSION))


4.expr ARGUMENT1 ARGUMET2 ARGUMENT3

    其中ARRGU1和ARGU3必須是整數數值;ARGU2是算數運算符;


5.echo "EXPRESSION" | bc


6.bc <<< "EXPRESSION"



三、文本處理工具

    全屏編輯器:vim,nano

    行編輯器:

文本處理三劍客:grep系列、sed、awk

    grep系:grep,egrep,fgrep,文本搜索工具;基於PATTERN(模式)對於給定的文本文件進行模糊搜索,grep系所有命令默認工作於貪婪搜索模式

            sed:stream editor,流編輯器,文本編輯工具

            awk:文本格式化工具,文件報告生成器,文件處理的編程語言:


四、grep系:

    grep:利用正則表達式進行全面搜索並將匹配到的行打印出來

        格式:

    grep [options] PATTERN FILE


        PATTERN:過濾匹配條件,是由沒有特殊意義的文本字符或者是正則表達式元字符組成

            pcre:正則表達式處理引擎,prel語言的正在表達式引擎


        正則表達式的元字符:

    1.基本的正則表達式元字符:BRE

             字符匹配類:

         . 匹配任意單個字符

         [] 匹配任意範圍內的單個字符

         [^] 匹配任意指定範圍以外的單個字符

         下列所有的字符集都可放置於[]中用於匹配字符集範圍內的單個字符

             [:lower:]

             [:upper:]

                     [:alpha:]

             [:digit:]

             [:xdigit:]

             [:alnum:]

             [:punct:]

             [:space:]

             [a-z] 僅小寫

             [A-Z] 僅大寫

             [0-9]

    

             次數匹配類:該類字符前面的一個字符可以出現的次數:

    * 其前面的字符可以出現任意次,0、1或無限

    \? 其前面的字符可有可無,0、1次

            \+  其前面的字符至少出現一次

    \{m,n\} 其前面的字符至少m次,最多n次

    \{m\} 其前面的自足必須出現m次

    \{m,\} 至少出現m次

    \{,n\} 最多出現n次


                    注意:在正則表達式中,表示任意長度的任意字符:.*


                位置錨定字符:

    行錨定:

行首錨定:^

行尾錨定:$

    字錨定:

字首錨定:\<或\b

字尾錨定:\>或\b


分組與前向引用字符:

    \(\) 將小括號中包含的內容作爲一個不可分割的整體來處理

    \1  \2  \3 ....;前向引用

    正則表達式處理引擎的內置變量,\1 表示前面所出現的第一組小括號中括選的內容;\2表示前面所出現的第二組小括號中括選的內容


    2.擴展的整的表達式元字符:ERE

             字符匹配類:

         . 匹配任意單個字符

         [] 匹配任意範圍內的單個字符

         [^] 匹配任意指定範圍以外的單個字符

         下列所有的字符集都可放置於[]中用於匹配字符集範圍內的單個字符

             [:lower:]

             [:upper:]

                     [:alpha:]

             [:digit:]

             [:xdigit:]

             [:alnum:]

             [:punct:]

             [:space:]

             [a-z] 僅小寫

             [A-Z] 僅大寫

             [0-9]

    

             次數匹配類:該類字符前面的一個字符可以出現的次數:

    * 其前面的字符可以出現任意次,0、1或無限

    ? 其前面的字符可有可無,0、1次

            +  其前面的字符至少出現一次

    {m,n} 其前面的字符至少m次,最多n次

    {m} 其前面的自足必須出現m次

    {m,} 至少出現m次

    {,n} 最多出現n次


                    注意:在正則表達式中,表示任意長度的任意字符:.*


                位置錨定字符:

    行錨定:

行首錨定:^

行尾錨定:$

    字錨定:

字首錨定:\<或\b

字尾錨定:\>或\b


分組與前向引用字符:

    () 將小括號中包含的內容作爲一個不可分割的整體來處理

    \1  \2  \3 ....;前向引用

    正則表達式處理引擎的內置變量,\1 表示前面所出現的第一組小括號中括選的內容;\2表示




grep:僅支持基本正則表達式元字符

egrep:可以支持擴展正則表達式元字符

fgrep:不支持任何格式的正則表達式元字符,將所有的字符都是會爲沒有任何特殊意義的原本字符


    -A num:同時顯示被PATTERN匹配到的行及後續num行

    -B num:同時顯示被PATTERN匹配到的行及前面num行

            -C num:同時顯示被PATTERN匹配到的行及前後num行

    -c --count:僅顯示匹配到的行數

    -E 支持擴展正則表達式

    -e PATTERN:多個條件,默認是與的關係

    -f FILE:從指定的文件中讀取多個PATTERN用於一次搜索

    -i 忽略文件中的大小寫

    -o 只顯示被PATTERN匹配到的部分

    -q 安靜模式,輸出結果被撤銷,沒有輸出結果,只關心命令成功與否

    -v 反向選擇,只選擇不匹配的行


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章