1. 程式人生 > >bash的多命令執行,shell腳本基礎及grep系

bash的多命令執行,shell腳本基礎及grep系

grep系

bash的特性之多命令執行的邏輯關系

1.命令替換

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的結果給三執行


取出 /etc/passw中的第9,10行

[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... :

[root@localhost ~]# echo -n "1";echo ";2"

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:顯示沒有被匹配到的行


註意:字錨定:是錨定沒有被特殊符號分隔的一串字符

bash的多命令執行,shell腳本基礎及grep系