bash的特性之多命令執行的邏輯關係:python
1.命令替換git
COMMAND1 $(COMMAND2)正則表達式
2.管道算法
COMMAND1 | COMMAND2 | COMMAND3 ...shell
3.順序執行結構express
COMMAND1 ; COMMAND2 ; COMMAND3 ...編程
4.選擇執行結構:vim
若是...那麼...bash
要麼...要麼...數據結構
邏輯運算:
與:邏輯乘法,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類的命令;
練習:寫一個腳本:
當alex用戶不存在時,建立之;若是成功建立,則顯示成功建立的提示信息,不然顯示用戶已存在。
利用bash腳本程序實現算術運算:
算術運算操做符:
經常使用的基本算術運算符:
+, -, *, /, %, **
加強型的算術運算符:
+=, -=, *=, /=, %=
特殊的加強型算術運算符:
++,--
算術運算方法:
1.$[expression]
其中的表達式能夠是純數字組成的,也可使用變量引用變量值;在使用變量時,能夠將$符號省略;
示例:
# echo $[3+4]
# NUM1=5 ; NUM2=4 ; echo $[NUM1*NUM2]
2.let VAR=EXPRESSION
根據算術表達式完成算術運算並賦值給指定的變量;
3.$((EXPRESSION))
其中的表達式能夠是純數字組成的,也可使用變量引用變量值;在使用變量時,能夠將$符號省略;
4.expr ARGU1 ARGU2 ARGU3
其中ARGU1和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:Global search Regular Expression and Print out the line.
利用正則表達式進行全局搜索並將匹配到的行顯示出來;
格式:
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
PATTERN:過濾匹配條件,是由沒有特殊意義的文本字符或者是正則表達式元字符組成;
正則表達式的元字符:會被正則表達式處理引擎解釋爲特殊含義的字符;
pcre:正則表達式處理引擎,prel語言的正在表達式引擎;
正在表達式的元字符:
基本的正則表達式元字符: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\}:其前面的字符出現至少出現0次,最多不超n次;
注意:在正則表達式中,表示任意長度的任意字符:.*
位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
分組與前向引用字符:
\(\):將小括號中包含的內容做爲一個不可分割的總體來處理;
\1, \2, \3,...:前向引用
正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中括選的內容;\2表示前面所出現的第二組小括號中括選的內容;...
\(string1\(string2\)\): \1表示string1,\2表示string2;
\(string1\).*\(string2\):\1表示string1,\2表示string2;
或者:
\|:將其左右的字符或字符串當作總體對待;
"C\|cat" C cat
擴展的正則表達式元字符: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}:其前面的字符出現至少出現0次,最多不超n次;
注意:在正則表達式中,表示任意長度的任意字符:.*
位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
分組與前向引用字符:
():將小括號中包含的內容做爲一個不可分割的總體來處理;
\1, \2, \3,...:前向引用
正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中括選的內容;\2表示前面所出現的第二組小括號中括選的內容;...
(string1(string2)): \1表示string1,\2表示string2;
(string1).*(string2):\1表示string1,\2表示string2;
或者:
|:將其左右的字符或字符串當作總體對待;
"C|cat" C cat
grep系:
grep:僅支持基本正則表達式元字符
egrep:能夠支持擴展正則表達式元字符
fgrep:不支持任何形式的正則表達式元字符,將全部的字符都視爲沒有任何特殊意義的普通文本字符;
經常使用選項:
-A num:同時顯示被PATTERN匹配到的行及其後續num行;
-B num:同時顯示被PATTERN匹配到的行及其前面num行;
-C num:同時顯示被PATTERN匹配到的行及其先後num行;
--color[=WHEN]:以高亮顏色顯示被匹配到的內容;
-c, --count:不輸出被PATTERN匹配的行的內容,而是輸出被PATTERN匹配到的行數;
-E, --extended-regexp:可使grep命令支持擴展正則表達式元字符;至關於執行了egrep命令;
-F, --fixed-strings:至關於fgrep;
-e PATTERN, --regexp=PATTERN:指定多個PATTERN在一個命令行中生效;
-f FILE, --file=FILE:從指定的文件中讀取多個PATTERN用於一次搜索;
-i, --ignore-case:忽略文件中的字符的大小寫;
-o, --only-matching:僅顯示被PATTERN匹配到的部分,關閉貪婪模式;
-q, --quiet, --silent:安靜模式;至關於 grep > /dev/null
-v, --invert-match:顯示沒有被PATTERN匹配到的行;