shell編程基礎(一)

shell
shell腳本編程:
    1)什麼叫編程,編程就是編寫程序源代碼。爲了能夠讓用戶在使用計算機的時候,可以讓計算機以非交互式的方式完成某   些任務,需要將這些任務編制稱爲一個文件,讓計算機順序讀取,從而實現功能;

    2)編程語言:
        高級語言:
            根據源代碼的處理方式:
                編譯運行語言:
                    源代碼 --> 編譯器(編譯) --> 彙編器(彙編) --> [鏈接器(庫的鏈接)] -->可以直接執行的二進制文件;
                解釋運行語言:
                    源代碼 --> 直接啓動跟源代碼對應的解釋器程序,由解釋器邊解釋邊執行;

            根據其編程過程中的功能的實現是調用庫還調用外部程序文件:
                完整編程語言:
                    利用庫或編程組件進行編程;

                腳本編程語言:
                    解釋器
                    shell腳本:調用shell程序,其次調用需要的外部命令文件;命令解釋器
                        提供了單一功能的編程接口:過程式編程邏輯的支持;

            根據程序的編寫範式:程序=指令+數據   程序=算法+數據結構
                過程式編程語言:
                    以指令(算法)爲中心,圍繞指令(算法)的實現設計數據和數據結構,數據爲指令服務的;

                    算法或指令的實現形式:
                        順序執行
                        選擇執行
                        循環執行

                對象式編程語言:
                    以數據爲中心,將數據實例化爲類,圍繞着數據的需求來部署指令
                        類(class):被實例化的數據
                        屬性(attribution):同一類中的不同對象的區分依據;
                        方法(method):類的正確的操作方法;

        低級語言:
            彙編語言

  shell腳本編程是一種過程式編程語言,解釋運行,依賴於外部程序文件運行;

    3)shell腳本到底是什麼?
      1.純文本文檔——文件中所存儲的數據都是以字符爲單位進行存儲的;
      2.根據用戶的需求來解決用戶問題的大量命令的組合體;
      3."執行冪等性"——任何命令多次執行的結果是一致的;
        很多命令都不具備"執行冪等性",在shell腳本中就需要使用大量的程序邏輯來判斷某個命令是否滿足其運行條件,以避免在運行過程中出現嚴重錯誤;

    4) shell腳本中的代碼內容:
      1.首行必須是shebang,解釋器路徑,必須佔據絕對行首:在執行時,啓動相應的解釋器以解釋腳本內諸多的命令;
        #!/bin/bash
        #!/bin/sh
        #!/usr/bin/python
        #!/usr/bin/perl
      2.在shell腳本中,除了shebang之外,以#佔據絕對行首的內容,均爲註釋行;解釋器會忽略這樣的行的內容;
      3.解釋會忽略腳本中所以的空白行;
      4.大量的命令和關鍵字(if,else,then,do,while,for,...)
      5.bash中所有的特殊字符;

注意:shell腳本一旦運行,是在當前的shell中根據shebang的指示,開啓一個解釋器(子shell)解釋執行代碼內容,shell腳本的內容是在一個子shell進程中實現的;

我們可以利用文本編輯工具來編寫shell腳本:
    nano、vi、vim、emacs、pico

推薦使用vim:語法着色特性,自動縮進,...

腳本命名方式:可以使用.sh的文件名後綴;在低版本的vim編輯器,只能根據.sh的後綴命令來識別是否爲shell腳本;高版本的vim編輯器,則無需過多的關心文件後綴名的問題;

  5)腳本的運行方法:
    1.爲腳本文件賦予執行權限,直接運行此文件;
        ~]# chmod +x /PATH/TO/SCRIPT_FILE
        ~]# /PATH/TO/SCRIPT_FILE

        如果在執行腳本時,只寫腳本文件名不給出路徑的話,必須確保PATH變量中保存的路徑下,能找到該腳本文件;

    2.直接使用解釋器運行腳本,將腳本作爲解釋器命令的參數;
        bash /PATH/TO/SCRIPT_FILE
        bash -x /PATH/TO/SCRIPT_FILE:將腳本的運行過程展示出來,一般用於腳本排錯;
        bash -n /PATH/TO/SCRIPT_FILE:對腳本進行語法排錯,如果存在語法錯誤,則bash會給予提示,針對於這類錯誤提示,需要我們自行判斷錯誤發生的位置;


  6)文本處理工具:
    vim、vi、nano

  文本處理三劍客:
    grep系:grep、egrep、fgrep,文本搜索工具,基於"PATTERN"對於給定的文本進行模糊搜索,grep系默認工作於貪婪模式下;

    sed:Stream EDitor,流編輯器,行編輯器,文本編輯工具;

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

    grep系:
     grep
     egrep
     fgrep

    grep:Global search Regular Expression and Print out the line.
                利用正則表達式進行全局搜索並將匹配的行顯示出來;
    grep [OPTIONS] PATTERN [FILE...]
        PATTERN:過濾條件,是由正則表達式元字符以及沒有特殊含義的文本字符組成;
            正則表達式的元字符:
                會被正則表達式引擎解釋爲特殊含義;
                pcre——perl語言的正則表達式引擎;

                基本的正則表達式:BRE
                擴展的正則表達式:ERE

    grep默認僅支持基本正則表達式;
    egrep默認僅支持擴展正則表達式;
    fgrep默認不開啓正則表達式引擎;

            文本字符:
                只具備字符便面含義的那些字符;
        常用選項:
            -i, --ignore-case:忽略文本字符的大小寫;
            -v, --invert-match:反向匹配;最終顯示的結果是PATTERN不能成功匹配的行;
            -c, --count:計數,統計匹配PATTERN的所有的行數;
            -o, --only-matching:關閉貪婪模式,僅顯示PATTERN能夠匹配的內容;
            -q, --quiet, --silent:安靜模式,不輸出任何匹配結果;
            --color[=WHEN], --colour[=WHEN]:將匹配PATTERN的內容以特殊顏色高亮顯示;
                --color=auto
            -E, --extended-regexp:擴展的正則表達式,grep -E相當於egrep;
            -F, --fixed-strings, --fixed-regexp:grep -F相當於fgrep
            -G, --basic-regexp:基本的正則表達式,egrep -G相當於grep
            -P, --perl-regexp:使用PCRE(Perl Common Regular Expression)引擎;
            -A NUM, --after-context=NUM:在顯示匹配PATTERN的行的同時顯示其後面的NUM行;
            -B NUM, --before-context=NUM:在顯示匹配PATTERN的行的同時顯示其前面的NUM行;
            -C NUM, -NUM, --context=NUM:在顯示匹配PATTERN的行的同時顯示其前後各NUM行;

        PATTERN:
            正則表達式元字符:
                基本的正則表達式元字符:
                    GLOBBING-------簡化版的正則表達式: [] ? *

                    字符匹配:
                        . :匹配任意單個字符;
                        []:匹配指定範圍內的任意單個字符;
                        [^]:匹配指定範圍以外的任意單個字符;
                        下列所有的字符集都可以放置於[]之中用於匹配單個字符;
                            [:lower:]
                            [:upper:]
                            [:alpha:]
                            [:digit:]
                            [:space:]
                            [:alnum:]
                            [:punct:]
                            [:blank:]
                            [:xdigit:]:所有的十六進制數字;
                            a-z:所有的小寫字母
                            A-Z:所有的大寫字母
                            0-9:標識所有的十進制數字
       [:alnum:](字母和數字),    [:alpha:](字母),    [:cntrl:](),   [:digit:](數字),
       [:graph:](),   [:lower:](小寫字母),    [:print:](可打印字符),    [:punct:](),
       [:space:](空格),  [:upper:](大寫字母),    [:xdigit:]


                    次數匹配:該類字符之前的那個字符可以出現的次數;
                        *:其前面的字符可以出現任意次(0次,1次或多次);
                        \?:其前面的字符可有可無(0次或1次);
                        \+:其前面的字符至少出現一次(1次或多次);
                        \{m\}:其前面的字符必須出現m次;
                        \{m,n\}:其前面的字符至少出現m次,至多出現n次;(m<n)
                        \{,n\}:其前面的字符至少出現0次,至多出現n次;
                        \{m,\}:其前面的字符至少出現m次,多多益善;

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

                    位置錨定字符:
                        行錨定:
                            行首錨定:^
                            行尾錨定:$
                        字錨定:
                            字首錨定:\<或\b
                            字尾錨定:\>或\b
                            \b:舊版本中的錨定方法,建議不使用;

                        對於正則表達式引擎來說,字是由非特殊字符組成的連續字符串;

                    分組與引用字符:
                        \(PATTERN\):將此PATTERN所匹配到的所有字符當作一個不可分割的整體來處理

                        在正則表達式引擎之中,有一系列的內置變量,這些變量會保存所有分組內的字符信息,用於後向引用;這些變量依次是:\1, \2, \3, ...

                        pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

                        \1:pattern2
                        \2:pattern4
                        \3:pattern5

                        \1:第一組小括號中的pattern匹配到的字符;
                        \2:第二組小括號中的pattern匹配到的字符;
                        ...

                    請找出在/etc/passwd中用戶的UID和GID相同的用戶賬戶;
                    ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd

                    或:
                        \|

                        注意:\|將其左右兩邊的字符串當作整體對待;

                        A\|american  :A或american

                    請找出ifconfig命令的執行結果中數值在100-255之間的整數;

                    第一位:1         2
                    第二位:0-9        0-4  5
                    第三位:0-9        0-9  0-5

                    ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'

    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

        默認情況下,grep命令後面只允許有一個PATTERN;
        如果想要在一次grep所搜過程中寫多個PATTERN,則需要使用-e選項;每個-e選項只能使用一個PATTERN作爲參數;

        將所需要的PATTERN寫入到一個文件中,保證每行只有一個PATTERN;我們就可以使用-f FILE方式來實現多PATTERN匹配;

    egrep:
        egrep [OPTIONS] PATTERN [FILE...]
            擴展的正則表達式元字符:
                字符匹配:
                    .
                    []
                    [^]

                次數匹配:
                    *
                    ?
                    +
                    {m}
                    {m,n}
                    {m,}
                    {0,n}

                位置錨定
                    ^
                    $
                    \<,\b
                    \>,\b

                分組和引用:
                    ()
                    \1, \2, \3,...

                或:
                    |

        fgrep:PATTERN中所有的字符都被當作文本字符來處理;

  其他的文本處理命令:
      wc:
          wc [OPTION]... [FILE]...
              -l:只顯示行數
              -w:只顯示字數
              -c:只顯示字符數

      cut:remove sections from each line of files
          能夠被cut命令修剪的文件,一般都是具有一定結構或格式的文本文檔;/etc/passwd
          cut OPTION... [FILE]...
              -d, --delimiter=DELIM:指定在實施修剪操作時所依賴的分隔符,默認是空白字符;
              -f, --fields=LIST:根據定義的分隔符來指定字段的編號;
                  地址定界使用方法:
                  #:選擇被指定的單個字段;
                  #,#:離散的多個被指定的單個字段;
                  #-#:連續的多個被指定的字段;
              --output-delimiter=STRING:指定輸出分隔符;

      awk:
          awk -F "DELIMITER" '[/PATTERN/]{print $1,$2,...$NF}' FILE...
              -F "DELIMITER":指定字段分隔符,默認爲空白字符;
              $1,$2,...,$NF:根據字段分隔符切割出來的文本片段都存放在相應的內部變量中;

      sort:sort lines of text files,將文本文件按行繼續排序,默認排序規則是按照ASCII表中的字符順序進行,這個排序標準可修改;
          -r, --reverse:逆序排序
          -R, --random-sort:隨機排序,這種隨機算法是非常簡陋的,不適用於複雜環境;
          -u, --unique:重複出現的行,只保留一行;(連續且完全相同的行叫重複),祛重;
          -n, --numeric-sort:以數字的數值大小進行排序;
          -t, --field-separator=SEP:指定字段分隔符;
          -k, --key=KEYDEF:指明根據哪個關鍵字段進行排序,一般和-t同時使用;

      uniq:report or omit repeated lines
          -d, --repeated:只顯示重複出現的行,而且每一組重複行只顯示一行;
          -u, --unique:只顯示不重複的行;
          -c, --count:在每行以前綴的方式顯示重複行的重複次數;

      diff:compare files line by line
          同一文件的不同修改版本;打補丁;

      patch:apply changes to files
           patch [-R][-i patchfile] [file]

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