您好,登錄后才能下訂單哦!
bash存在多命令執(zhí)行的特性,例如:# COMMAND1 $(COMMAND2);還有進(jìn)程之間的通信(IPC):# COMMAND1 | COMMAND2…
一、命令執(zhí)行結(jié)構(gòu)與算法
命令執(zhí)行中,存在順序執(zhí)行結(jié)構(gòu):分號分隔 # COMMAND1 ; COMMAND2 ; …。同時存在選擇執(zhí)行結(jié)構(gòu):邏輯運(yùn)算與、或、非、異或,其中最主要的為選擇執(zhí)行結(jié)構(gòu),具體討論如下。
1、與:邏輯乘法 &&
狀態(tài)返回值:0對應(yīng)TRUE,1-255對應(yīng)FALSE
具體算法為:True &&true == true
True && false == false
False &&true == false
False && false == false
與運(yùn)算存在短路邏輯運(yùn)算:只要第一個邏輯操作數(shù)為假,則其邏輯操作結(jié)果一定為假。例如COMMAND1 && COMMAND2,解釋為:如果COMMAND1能夠成功執(zhí)行,則COMMAND2會被執(zhí)行;如果COMMAND1能夠成功執(zhí)行,則COMMAND2會被執(zhí)行
2、或:邏輯加法 ||
具體算法為:True || true == true
True || false == true
False || true == true
False || false == false
或的短路邏輯運(yùn)算:主要有一個邏輯操作數(shù)為true,則其邏輯運(yùn)算結(jié)果一定為true。例如COMMAND1 || COMMAND2,解釋為:如果COMMAND1能夠成功執(zhí)行,則COMMAND2就沒有必要執(zhí)行;如果COMMAND1執(zhí)行失敗,則COMMAND2不會被執(zhí)行
3、非:邏輯取反 !
具體算法為: !COMMAND (!true = false、!false = true)
綜合以上三點(diǎn),可以得到:
邏輯運(yùn)算符優(yōu)先級: !> && > ||
!COMMAND1 &&COMMAND2相當(dāng)于 COMMAND1 ||COMMAND2,解釋為:如果COMMAND1能夠成功執(zhí)行,則COMMAND2就沒有必要執(zhí)行;如果COMMAND1執(zhí)行失敗,則COMMAND2不會被執(zhí)行
!COMMAND1 || COMMAND2相當(dāng)于 COMMAND1 && COMMAND2,解釋為: 如果COMMAND1能夠成功執(zhí)行,則COMMAND2會被執(zhí)行;如果COMMAND1執(zhí)行失敗,則COMMAND2不會被執(zhí)行
德摩根定律:!(A&&B)==!A||!B
!(A||B)==!A&&!B
德摩根定律的例子為:!(COMMAND1 &&COMMAND2)|| COMMAND3,解釋為:COMMAND1 與COMMAND2同時執(zhí)行成功才執(zhí)行COMMAND3
算法或指令的實(shí)現(xiàn)形式:順序執(zhí)行、選擇執(zhí)行、循環(huán)執(zhí)行
4、異或
比對兩個操作數(shù)是否不同。如果不同,則邏輯運(yùn)算結(jié)果為真,如果相同,邏輯運(yùn)算結(jié)果為假
二、Shell腳本編程
Shell腳本編程的編程即編寫程序源代碼。為了能夠讓用戶在使用計算機(jī)的時候,能以非交互式的方式完成某些任務(wù),所以我們需要把這些任務(wù)編制為一個文件,讓計算機(jī)順序讀取,從而實(shí)現(xiàn)功能;Shell腳本編程的動態(tài)編譯即調(diào)用庫文件。
shell腳本是根據(jù)用戶的需求解釋用戶問題的大量命令組合體,為純文本文檔;調(diào)用shell程序,其次調(diào)用需要的外部命令文件,命令解釋器。 Shell腳本編程為過程式編程語言,解釋運(yùn)行,依賴于外部程序文件運(yùn)行 提供了單一功能的單程接口,過程式編程邏輯的支持。
很多命令都不具備“執(zhí)行冪等性”,在shell腳本中就需要使用大量的程序邏輯來判斷某個目命令是否滿足其運(yùn)行條件,以避免在運(yùn)行過程中出現(xiàn)嚴(yán)重錯誤
編程語言分為高級語言和低級語言,具體解釋如下。
1、高級語言
(1)、根據(jù)源代碼的處理方式分為:編譯運(yùn)行語言、解釋運(yùn)行語言
編譯運(yùn)行語言具體過程為:源代碼----->編譯器(匯編)-----> [連接器(完成庫的鏈接行為)]------->可以直接執(zhí)行的二進(jìn)制文件
解釋運(yùn)行語言具體過程為:源代碼------->直接啟動跟源代碼對應(yīng)的解釋器程序,由解釋器邊解釋邊執(zhí)行
(2)、根據(jù)編程過程中功能的實(shí)現(xiàn)是調(diào)用庫還是調(diào)用外部程序分為:完整編程語言、腳本編程語言
完整編程語言具體為:利用庫或編程組件進(jìn)行編程
腳本編程語言具體為:解釋器編程
(3)、根據(jù)程序的編寫范式分為:過程式編程語言、對象式編程語言
過程式編程語言具體為:圍繞指令(算法)的實(shí)現(xiàn)設(shè)計數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)為指令服務(wù)
對象式編程語言具體為:以數(shù)據(jù)(數(shù)據(jù)結(jié)構(gòu))為中心,將數(shù)據(jù)實(shí)例化為類,圍繞數(shù)據(jù)的需求來部署指令 類、屬性、方法
2、低級語言:匯編語言。
Shell腳本中的代碼內(nèi)容有如下要求和解釋:
1、首行必須是shebang,解釋器路徑,必須占據(jù)絕對行首;在執(zhí)行時,啟動相應(yīng)的解釋器以解釋腳本內(nèi)諸多的命令
例如:#!/bin/bash ;#!/bin/sh ;#!/usr/bin/python
2、在shell腳本中,除了shebang之外,以#占據(jù)絕對行首的內(nèi)容,均為注釋行,解釋器會會忽略這樣行的內(nèi)容
3、解釋會忽略腳本中所有的空白行
4、大量的命令和關(guān)鍵字(if, else, then, do, while, for……)
注意:shell腳本一旦運(yùn)行,是在當(dāng)前的shell中根據(jù)shebang的指示,開啟一個指示器(子shell)解釋執(zhí)行代碼內(nèi)容,shell腳本的內(nèi)容是在一個子shell中實(shí)現(xiàn)的
腳本的運(yùn)行方法部分方法如下:
1、為文本文件賦予執(zhí)行權(quán)限,直接運(yùn)行此文件;如果在執(zhí)行腳本時,只寫腳本文件名不給出路徑的話,必須確保PATH變量中保存的路徑下,能找到該文本文件
例如:chmod +x /PATH/TO/SCRIPT_FILE
~]# /PATH/TO/SCRIPT_FILE
2、直接使用解釋器運(yùn)行腳本,將腳本作為解釋器命令的參數(shù)
例如:bash /PATH/TO/SCRIPT_FILE
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。