bash的特性之多命令執行的邏輯關係python
1.命令替換git
COMMAND1 $(COMMAND2) :先執行COMMAND2而後再做爲COMMAND1的參數執行COMMAND1正則表達式
[root@localhost ~]# ls /mnt a.sh a.txt ---------------------------------------------------------- [root@localhost mnt]# cat a.sh echo "你好" --------------------------------------------------------- [root@localhost mnt]# cat a.txt useradd xiaoming -c "wang xiaoming" -u 8089 -g 8089 passwd xiaoming -n 5 -x 30 -w 3 -i 7 ----------------------------------------------------------- [root@localhost ~]# cat $(ls /mnt) echo "你好" useradd xiaoming -c "wang xiaoming" -u 8089 -g 8089 passwd xiaoming -n 5 -x 30 -w 3 -i 7
2.管道算法
COMMAND1 | COMMAND2 |COMMAND3 :先執行1,而後再把1的結果做爲2的參數執行,再把2的結果給三執行shell
取出 /etc/passw中的第9,10行express
[root@localhost ~]# head -10 /etc/passwd|tail -2 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin
3.順序執行結構編程
COMMAND1;COMMAN2;COMMAND3... :vim
[root@localhost ~]# echo -n "1";echo ";2"bash
1;2編程語言
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,則其邏輯運算結果必定爲ture
非 :邏輯取反 1--真,0--假, !,單目操做符
!0=1
!1=0
COMMAND1 && COMMAND2
1.表示若是COMMADN1執行成功,則將會執行COMMAND2
2.表示若是COMMAND2執行失敗,則不會執行COMMAND2
COMMAND1 || COMMAND2
1.只有COMMAND1執行失敗,COMMAND2纔會被執行
2.若是COMMAND1執行成功,COMMAND2不會被執行
!COMMAND1 && COMMAND2 == COMMAND1 || COMMAND2
!COMMAND1 || COMMAND2 == COMMAND1 && COMMAND2
德·摩根定律
!(COMMAND1 && COMMAND2) || COMMAND3
!(COMMAND1 || COMMAND2) && COMMAND3
!(A && B) = !A || !B
!(A || B) = !A && !B
三種邏輯運算的優先級:
!>&&>||
注意:邏輯運算考慮的是其狀態返回值
shell腳本編程--bash腳本編程:
過程式編程語言,解釋運行的編程語言,腳本類語言(依靠外部應用程序文件運行)
shell腳本究竟是什麼?
1.純文本文檔——文件中全部存儲或包含的指令+數據都是以字符爲單位進行存儲的
2.根據用戶的需求來解決用戶問題的簡單或複雜的命令組合體
3.是一種具備「執行冪等性」的程序實體
執行冪等性:任何命令的一次執行結果和屢次執行結果時一致的
注意:不少命令都不具有"執行冪等性",所以在shell腳本中咱們須要使用大量的程序邏輯來判斷某個命令是否
符合其運行條件,從而避免在運行過程當中出現的嚴重錯誤
shell腳本中的代碼內容如何出現?
1.首行必須是shebang,即解釋器程序的絕對路徑,並且必須佔據絕對行首;且必須單獨佔據第一行,在執行腳本時,
會根據shebang的指示啓動相應的解釋器以解釋腳本內諸多的命令;
#!/bin/bash
#!/bin/sh
#!/usr/bin/python
#!/usr/bin/per1
.....
2.在shell腳本中除了shebang以外,全部行首爲#字符的行均被解釋爲 註釋行;即:解釋器只會解釋其內容,但不
予以執行
3.解釋器會忽略腳本文件中全部的空白行;空白行指的是:在一行文本中除了空白字符,空格字符,製表字符以外
不具有其餘任何類型的字符的行
4.大量的命令和關鍵字
命令:內部或外部應用程序
關鍵字:內置於shell,只能在某種特定結構體中執行的命令;keyword;
如:if,else,then,do,while,for,select,until,case,fi,esac.....
5.shell中的全部的特殊功能字符
注意:全部被編寫進shell腳本文檔的字符必須是ASCLL編碼格式的字符,其餘編碼格式的字符能夠出如今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
注意:source命令不會在運行腳本時開啓子shell,而是在當前shell中執行;
使用source命令執行的腳本中不要包括諸如exit類的命令
利用bash腳本實現算數運算:
算術運算操做符
經常使用的基本算數運算符:
+ - * / % **
加強型的算數運算符:
+= -= *= /= %=
特殊的加強型算術運算符
++ --
建立一個變量wc1,如何區分++wc1 ,wc1++ 和 wc1+= [root@localhost ~]# wc1=4 [root@localhost ~]# echo "$[wc1++]" 4 [root@localhost ~]# echo $wc1 5 wc1++ :將wc1輸出,而後再讓他的值+1 [root@localhost ~]# echo "$[++wc1]" 6 [root@localhost ~]# echo $wc1 6 ++wc1,將wc1的值加1而後再輸出 [root@localhost ~]# echo "$[wc1+=4]" 10 [root@localhost ~]# echo $wc1 10 wc1+=4 :將wc1的值加4再賦值給wc1
算術運算方法:
1.$[expression]
其中的表達式能夠是純數字組成的,也可使用變量引用變量值;在使用變量時,能夠將$符號省略
[root@localhost ~]# echo "$[3+4]" 7
2.let VAR=EXPRESSION
根據算術表達式完成算術運算並賦值給指定的變量
3.$((EXPRESSION))
其中的表達式能夠是純數字組成的,也可使用變量引用變量值;在使用變量時,能夠將$符號省略
4.expr ARGU1 ARGU2 ARGU3
其中ARGU1 和 ARGU3必須是整數數值 ARGU2是算術運算符
5.echo "EXPRESSION" | bc
6.bc <<<EXPRESSION
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
1.字符匹配類:
.:匹配任意單個字符
[]:匹配任意指定範圍內的單個字符
[^]:匹配任意指定範圍外的單個字符
下列全部的字符集均可以放置於[]之中用於匹配字符集範圍內的單個字符
[:lower:] [:upper:] [:alpha:] [:digit:] [:xdigit:] [:alnum:] [:punct:] [:space:]
[a-z]:僅表示全部的小寫字母
[A-Z]:僅表示全部的大寫字母
[0-9]:僅表示全部的十進制數碼
2.次數匹配類: 該字符前面的一個字符能夠出現的次數
*:表示前面的字符能夠出現任意次,即:0-n
\?:表示其前面的字符無關緊要,即0次 或 1次
\+:表示其前面的字符至少出現一次
\{m,n\}:表示其前面的字符至少出現m次,最多不超過n次
\{m\}:表示其前面的字符必須出現m次
\{m,\}:表示其前面的字符至少出現m次
\{,n\}:表示其前面的字符最多不超過n次
注意:在正則表達式中,表示任意長度的任意字符:.*
3.位置錨定字符
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
4.分組與前向引用字符:
\(\):把括號內包含的內容做爲一個不可分割的總體來處理
\1,\2,\3,....:前向引用
正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中擴選的內容;\2表示第二組
小括號中的內容
5.\|:將其左右的字符串當作總體來對待
"C\|cat" 匹配 C 或cat
注意:^"C\|cat"不等於匹配 ^C 或 ^cat,而是^C 或cat
經常使用選項:
擴展的正則表達式元字符:ERE
基本的正則表達式元字符:BRE
1.字符匹配類:
.:匹配任意單個字符
[]:匹配任意指定範圍內的單個字符
[^]:匹配任意指定範圍外的單個字符
下列全部的字符集均可以放置於[]之中用於匹配字符集範圍內的單個字符
[:lower:] [:upper:] [:alpha:] [:digit:] [:xdigit:] [:alnum:] [:punct:] [:space:]
[a-z]:僅表示全部的小寫字母
[A-Z]:僅表示全部的大寫字母
[0-9]:僅表示全部的十進制數碼
2.次數匹配類: 該字符前面的一個字符能夠出現的次數
*:表示前面的字符能夠出現任意次,即:0-n
?:表示其前面的字符無關緊要,即0次 或 1次
+:表示其前面的字符至少出現一次
{m,n}:表示其前面的字符至少出現m次,最多不超過n次
{m}:表示其前面的字符必須出現m次
{m,}:表示其前面的字符至少出現m次
{,n}:表示其前面的字符最多不超過n次
注意:在正則表達式中,表示任意長度的任意字符:.*
3.位置錨定字符
行錨定:
行首錨定:^
行尾錨定:$
字錨定:
字首錨定:\<或\b
字尾錨定:\>或\b
4.分組與前向引用字符:
():把括號內包含的內容做爲一個不可分割的總體來處理
\1,\2,\3,....:前向引用
正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中擴選的內容;\2表示第二組
小括號中的內容
5.|:將其左右的字符串當作總體來對待
"C|cat" C 或cat
grep系:
grep:僅支持基本正則表達式元字符
egrep:能夠支持擴展正則表達式元字符
fgrep:不支持任何形式的正則表達式元字符,把全部的字符視爲普通文本字符
經常使用選項:
-A num :顯示被匹配到的行以及其後num行
-B num :顯示被匹配到的行以及其前num行
-C num :顯示被匹配到的行及其先後num行
--color[=WHEN]:以高亮顏色來顯示被匹配到的內容
-c --count :不顯示被匹配的結果,而是輸出被匹配到的行數
-E :至關於執行egrep
-F : --fixed-strings :至關於fgrep
-e :指定多個【模式】在一個命令行中生效
-f :從指定的文件中讀取多個PATTERN用於一次搜索
-i :--ignore-case 忽略字母大小寫
-o :--only-matching:僅顯示被PATTERN匹配到的部分,而且分行顯示
-q :--quite,--silent:安靜模式;至關於grep > /dev/null
-v :--invert-match:顯示沒有被匹配到的行
注意:字錨定:是錨定沒有被特殊符號分隔的一串字符