1. 程式人生 > >bash特性以及shell腳本簡介

bash特性以及shell腳本簡介

權限 完成 ascii 處理方式 直接 為什麽 sci shell腳本簡介 ...

bash的特性之多命令執行的邏輯關系:
1.命令替換
COMMAND1 $(COMMAND2)
2.管道
COMMAND1 | COMMAND2 | COMMAND3 ...
3.順序執行結構
COMMAND1 ; COMMAND2 ; COMMAND3 ...
4.選擇執行結構:
如果...那麽...
要麽...要麽...
邏輯運算:
與:邏輯乘法,1--真,0--假,&&,雙目操作符
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0

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

        或:邏輯加法,1--真,0--假,||,雙目操作符
            1 || 1 = 1
            1 || 0 = 1
            0 || 1 = 1
            0 || 0 = 0

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

        非:邏輯取反,1--真,0--假,!,單目操作符
            !0 = 1
            !1 = 0

    命令的執行狀態返回值:
        SUCCESS:0--TURE(true)
        FAILURE:1-255--FALSE(false)

        COMMAND1 && COMMAND2

        表示:
            1.如果COMMAND1能夠成功執行,那麽將會執行COMMAND2;
            2.如果COMMAND1執行失敗,那麽COMMAND2將不會被執行;

        COMMAND1 || COMMAND2

        表示:
            1.只有COMMAND1執行失敗,COMMAND2才會被執行;
            2.如果COMMAND1執行成功,那麽COMMAND2就不會被執行;

        !COMMADN1 && COMMAND2 相當於 COMMAND1 || COMMAND2
        !COMMAND1 || COMMAND2 相當於 COMMAND1 && COMMAND2

        德·摩根定律
        !(COMMAND1 && COMMAND2) || COMMAND3
        !(COMMAND1 || COMMAND2) && COMMAND3

        !A && B = A || B
        !A || B = A && B

        !(A && B) = !A || !B
        !(A || B) = !A && !B

三種邏輯運算的優先級:
    !>&&>||

示例:
    如果用戶user4存在並且其家目錄也存在,那麽就執行userdel -r user4命令;

    id user4 &&  ls -d /home/user4 && userdel -r user4

bash腳本編程:
什麽叫編程?
使用人類自然語言或機器語言進行程序源代碼書寫的過程。

為什麽要編程?
    為了能夠讓用戶在使用計算機的時候,可以讓計算機以非交互的方式完成某些任務;此時,用戶需要將此類任務編輯稱為一個文件,並且讓計算機按照特定書序進行任務讀取,從而實現預期的功能;

為了讓計算機能夠解讀此類文件的內容並正確的予以執行,必須將程序源代碼文件轉換為計算機可以直接識別並使用的二進制格式,此轉換過程稱為編譯;而想要完成編譯過程,必須使用特定的編譯器工具;因此,無論使用何種編程語言進行程序編寫,都必須嚴格按照編譯器所能夠識別的特定格式和語法結構進行程序編寫;

編程語言:
    高級語言:
        根據源代碼的處理方式分類:
            編譯型語言:
                源代碼 --> 編譯器(編譯) --> [鏈接器(鏈接) --> ] 匯編器(匯編) --> 可以執行的二進制代碼文件;
            解釋型語言
                源代碼 --> 解釋器(逐行解釋) --> 邊解釋邊執行

        根據編程過程中的功能實現是調用庫還是調用外部程序文件分類:
            完整編程語言:
                利用庫或編程組件進行編程;
            腳本編程語言:
                利用解釋器調用被選擇的外部應用程序;

        根據程序的編寫規範分類:
            過程式語言:
                程序 = 指令 + 數據
                以指令為中心,圍繞指令的功能實現設計數據和數據結構,數據為指令服務;
                算法和指令的實現形式:
                    順序執行
                    選擇執行
                    循環執行

            面向對象語言:
                程序 = 算法 + 數據結構
                以數據和數據結構為中心,將數據實例化,圍繞數據的需求來部署算法;
                    類(Class):被實例化的數據;
                    屬性(attibution):同一類中的不同對象的區分依據;
                    方法(method):類的正確的操作方法;

    低級語言:
        匯編語言:

    機器語言:二進制語言

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

shell腳本到底是什麽?
    1.純文本文檔——文件中所有存儲或包含的指令+數據都是以字符為單位進行存儲的;
    2.根據用戶的需求來解決用戶問題的簡單或復雜的命令組合體;
    3.是一種具有"執行冪等性"的程序實體;
        執行冪等性:任何命令的一次執行結果和多次執行結果是一致的;

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

shell腳本中的代碼內容如何書寫?
    1.首行必須是shebang,即:解釋器程序的絕對路徑,必須占據絕對行首且必須單獨占據第一行;在執行腳本時,會根據shebang的指示,啟動相應的解釋器以解釋腳本被諸多的命令;
        #!/bin/bash
        #!/bin/sh
        #!/usr/bin/python
        #!/usr/bin/perl
        ...

    2.在shell腳本中,除了shebang之外,所有行首為#字符的行,均被解釋為註釋行;即:解釋器只會解釋其內容,但並不予以執行;

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

    4.大量的命令和關鍵字
        命令:內部或外部應用程序
        關鍵字:內置於shell,只能在某種特定結構體中執行的命令;keyword;
            如:if, else, then, do, while, for, select, until, case, fi, esac,...

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

    註意:所有被編寫進shell腳本文檔的命令、關鍵字及符號必須是ASCII編碼格式的字符,其他編碼格式的字符可以出現在shell腳本文件中,但不具有任何特殊含義;

如何編寫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
            bash命令的常用選項:
                -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命令執行的腳本中不要包括諸如exit類的命令;

bash特性以及shell腳本簡介