bash特性以及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 = 0python

"與"運算的短路運算法則:只要第一個操做數爲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類的命令;
相關文章
相關標籤/搜索