1. 程式人生 > >bash編程及多命令

bash編程及多命令

bash命令


bash腳本編程:

編程?使用人類自然語言或機器語言進行程序源代碼書寫的過程

為什麽要編程?為了能夠讓用戶在使用計算機的時候,可以讓計算機以非交互的方式完成某些任務;此時用戶需要將此類任務編輯成為一個文件,並且讓計算機按照特定書序進行任務讀取,從而實現預期的功能

為了讓計算機能夠解讀此類文件的內容並正確的予以執行,必須將程序源代碼文件轉換為計算機可以直接識別並使用的二進制格式,此轉換過程稱為編譯;而想要完成編譯過程,必須使用特定的編譯器工具;因此,無論使用何種編譯語言進行程序編寫,都必須嚴格按照編譯器所能夠識別的特定格式和語法結構進行程序編寫

編程語言:

高級語言:

根據源代碼的處理方式分類:

編譯型語言:

源代碼-->編譯器(編譯)-->[鏈接器(鏈接)-->]匯編器(匯編)-->可以執行的二進制代碼文件

解釋型語言

源代碼-->解釋器(逐行解釋)-->邊解釋邊執行

根據編譯過程中的功能實現是調用庫還是調用外部程序文件分類:

完整編譯語言:

利用庫或編程組件進行編程

腳本編程語言:

利用解釋器調用被選擇的外部應用程序

根據程序的編寫規範分類

過程式語言:

程序=指令+數據

以指令為中心,圍繞指令的功能實現設計數據和數據結構,數據為指令服務

算法和指令的實現形式

順序執行

選擇執行

循環執行

面向對象語言:

程序=算法+數據結構

以數據和數據結構為中心,將數據實例化,圍繞數據的需求來部署算法

類(class):被實例化的數據

屬性(attribution):同一類中的不同對象的區分依據

方法(method):類的正確的操作方法

低級語言:

匯編語言

機器語言:

二進制代碼

shell腳本編程-bash腳本編程:

過程式編程語言,解釋運行的編程語言,腳本類語言(依靠外部應用程序文件運行)

shell腳本是什麽?

純文本文檔-文件中所有存儲或包含的指令+數據都是以字符為單位進行存儲的

根據用戶的需求解決用戶問題的簡單或復雜的命令組合體

是一種具有“執行冪等性”的程序實體

執行冪等性:任何命令的一次執行結果和多次執行結果是一致的

*註意:很多命令都不具備“執行冪等性”,因此在shell腳本中需要使用大量的程序邏輯來判斷某個命令是否符合其運行條件,從而避免在運行過程中出現的嚴重錯誤

shell腳本中的代碼內容如何書寫?

1.首行必須是shebang,即解釋器的程序的絕對路徑,必須占據絕對行首且必須單獨占據第一行,在執行腳本時,會根據shebang的指示,啟動相應的解釋器以解釋腳本被諸多的命令

#!/bin/bash

#!/bin/sh

#!/usr/bin/python

...

2.在shell腳本中,除了shebang之外,所有行首為#字符的行,均被解釋為註釋行;即解釋器只會解釋其內容,但並不執行

3.解釋器會忽略腳本文件中所有的空白行(在一行文本中,除了空白字符,空格字符,制表字符之外不具備其他任何類型字符的行)

4.大量的命令和關鍵字

命令:內部或外部應用程序

關鍵字:內置於shell只能在某種特定結構體中執行的命令;keyword

如:if,else,then,do,while,for,select

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也會被隨之銷毀;因此,所有在腳本中定義的變量,在腳本的末尾處,最好將其明確的撤銷 gc

3.使用source命令運行腳本:

# source /PATH/TO/SOME_SCRIPT_FILE

# . /PATH/TO/SOME_SCRIPT_FILE

註意:

1.source命令不會在運行腳本時開啟子shell,而是

2.使用source命令執行的腳本中不要包括諸如exit類的命令

利用bash腳本程序實現算數運算

算數運算操作符:

常用的基本算數運算符:

+,-,*,/,%,**

增強型的算數運算符:

+=,-=,*=,/=,%=

特殊的增強型算數運算符:

++,--

算數運算方法:

1.$[expression]其中的表達式可以是純數字組成的,也可以使用變量引用變量值:在使用變量時,可以將$符號省略

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: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次,一次或多次

\?:其前面的字符可有可無,即:0次或1次

\+:其前面的字符至少出現一次

\{m,n\}:其前面的字符至少出現m個,最多不超過n個

\{m\}:其前面的字符必須出現m次

\{m,\}:其前面的字符至少出現m次

\{,n\}:其前面的字符出現最多不超過n次

註意:在正則表達式中,表示任意長度的任意字符:.*

位置錨定字符:

行錨定:

行首錨定:^

行尾錨定:$

字錨定:

字首錨定:\<或\b

字尾錨定:\>或\b

分組與前向引用字符:

\(\):將小括號中包含的內容作為不可分割的整體來處理

\1,\2,\3,...:前向引用字符

正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中括選的內容:\2表示前面所出現的第二組小括號中括選的內容;...

或者:

\|:將其左右的字符或字符串當作整體對待;

“C\|cat” == C 或 cat

擴展的正則表達式元字符:ERE

基本的正則表達式元字符:BRE

字符匹配類:

.:匹配任意單個字符

[]:匹配任意指定範圍內的單個字符

[^]:匹配任意指定範圍內的單個字符

下列所有的字符集都可以放置於[]之中用於匹配字符集範圍內的單個字符;

[:lower:]

[:upper:]

[:alpha:]

[:digit:]

[:xdigit:]

[:alnum:]

[:punct:]

[:space:]

[a-z]:僅表示所有的小寫字母

[A-Z]:僅表示所有的大寫字母

[0-9]:僅表示所有的十進制數碼

次數匹配類:該類字符前面的一個字符可以出現的次數;

*:其前面的字符可以出現任意次,即:0次,一次或多次

?:其前面的字符可有可無,即:0次或1次

+:其前面的字符至少出現一次

{m,n}:其前面的字符至少出現m個,最多不超過n個

{m}:其前面的字符必須出現m次

{m,}:其前面的字符至少出現m次

{,n}:其前面的字符出現最多不超過n次

註意:在正則表達式中,表示任意長度的任意字符:.*

位置錨定字符:

行錨定:

行首錨定:^

行尾錨定:$

字錨定:

字首錨定:\<或\b

字尾錨定:\>或\b

分組與前向引用字符:

():將小括號中包含的內容作為不可分割的整體來處理

\1,\2,\3,...:前向引用字符

正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中括選的內容:\2表示前面所出現的第二組小括號中括選的內容;...

或者:

|:將其左右的字符或字符串當作整體對待;

“C|cat” C cat”

grep系:

grep:僅支持基本正則表達式元字符

egrep:可以支持擴展正則表達式元字符

fgrep:不支持任何形式的正則表達式元字符,將所有的字符都視為沒有任何特殊意義的普通文本字符

常用選項:

-A num:同時顯示被PATTERN匹配到的行及其後續num行

-B num:打印出匹配的行之前的上文

-C num:打印出匹配的行的上下文前後各 NUM 行

--colour[=WHEN]:在匹配的行周圍以指定的顏色來標記

-c, --count:不輸出被PATTERN匹配的行的內容,而是以輸出被PATTERN匹配到的行數

-E, --extended-regexp:可以使用grep命令支持擴展正則表達式元字符;相當於執行了egrep命令

-F, --fixed-strings:相當於fgrep

-e PATTERN, --regexp=PATTERN指定多個

-f FILE, --file=FILE

-i, --ignore-case

-o, --only-matching

-q, --quiet, --silent

-v, --invert-match:只選擇不匹配的行


本文出自 “小小殊童” 博客,請務必保留此出處http://yigechenlin.blog.51cto.com/13306169/1983176

bash編程及多命令