shell study-Shell指令碼編程的常識(這些往往是經常用到,但是各種網路上的材料都語焉不詳的東西,個人認為比較有用)

來源:互聯網
上載者:User

shell線上中文手冊abs,shell中文教程,shell中文教程 - 海底蒼鷹(tank)部落格

http://manual.51yip.com/shell/


http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM

 

SHELL指令碼編程的常識

七種檔案類型

Regex

字元類描述

shell的引號類型

變數設定時的不同模式:

條件測試

命令執行順序

指令碼調試

一些常用的小TRICK

列印一些頭資訊

建立一個長度為0的空檔案

一些常用的shell變數

$0的使用

Shift的運用

用head或tail指令指定查閱的行數

AWK使用規則

第一個 awk

多個欄位

外部指令碼

BEGIN 和 END 塊

規則運算式和塊

條件陳述式

數值變數

字串化變數

眾多運算子

欄位分隔符號

欄位數量

記錄號

多行記錄

OFS 和 ORS

將多行轉換成用 tab 分隔的格式

迴圈結構

for 迴圈

break 和 continue

數組下標字串化

數組工具

格式化輸出

字串函數

一些更耐人尋味的函數

字串替換

特殊字元串形式

SED使用規則

sed 樣本

另一個 sed 樣本

位址範圍

帶規則運算式的地址

有關地址的更多內容

替換

規則運算式混亂

更多字元匹配

進階替換功能

組合使用

一個地址的多個命令

附加、插入和更改行

使用 sed 的幾個樣本

LINUX常用指令碼和函數

LINUX常用命令

關於檔案/目錄處理的指令:

關於 Process 處理的指令:

關於字串處理的指令:

聯機查詢的指令:

網路運用指令:

VI常用技巧


  Shell指令碼編程的常識

(這些往往是經常用到,但是各種網路上的材料都語焉不詳的東西,個人認為比較有用) 七種檔案類型

d            目錄                                                       l             符號連結

s             通訊端檔案                                           b            塊裝置檔案

c            字元裝置檔案                                       p            具名管道檔案

-             普通檔案 Regex

從一個檔案或命令輸出中抽取或過濾文本時。可使用Regex(RE),Regex是一些特殊或不很特殊的字串模式的集合。

       基本的元字元集:

       ^                   只匹配行首。

       $                   只匹配行尾。

       *                   一個單字元後緊跟*,匹配0個或多個此單字元。

       []                   匹配[]內字元,可以是一個單字元,也可以是字元序列。可以使

              用-來表示[]內範圍,如[1-5]等價於[1,2,3,4,5]。

\                    屏蔽一個元字元的特殊含義,如\$表示字元$,而不表示匹配行

                    尾。

       .                 匹配任意單字元。

       pattern\{n\}   匹配pattern出現的次數n

       pattern\{n,\}m匹配pattern出現的次數,但表示次數最少為n

       pattern\{n,m\} 匹配pattern出現的次數在n與m之間(n,m為0-255)

 

幾個常見的例子:

       顯示可執行檔檔案:ls –l | grep …x...x..x

       只顯示檔案夾:ls –l | grep  ^d

       匹配所有的空行:^$

       匹配所有的單詞:[A-Z a-z]*

       匹配任一非字母型字元:[^A-Z a-z]

       包含八個字元的行:^……..$(8個.) 字元類描述

以下是可用字元類的相當完整的列表:

[:alnum:] 字母數字 [a-z A-Z 0-9]

[:alpha:] 字母 [a-z A-Z]

[:blank:] 空格或製表鍵

[:cntrl:] 任何控制字元

[:digit:] 數字 [0-9]

[:graph:] 任何可視字元(無空格)

[:lower:] 小寫 [a-z]

[:print:] 非控制字元

[:punct:] 標點字元

[:space:] 空格

[:upper:] 大寫 [A-Z]

[:xdigit:] 十六進位數字 [0-9 a-f A-F]

儘可能使用字元類是很有利的,因為它們可以更好地適應非英語 locale(包括某些必需的重音字元等等). shell的引號類型

shell共有四種參考型別:

       “ ”          雙引號

       ‘ ’           單引號

` `         反引號

\            反斜線

l        “ ” 可引用除$、` 、\ 、外的任一字元或字串,“ ”中的變數能夠正常顯示變數值。

l        ‘ ’與“ ”類似,不同在於shell會忽略任何的引用值。

              例如: GIRL=‘girl’

                        echo “The ‘$GIRL’ did well”

              則列印:The ‘girl’ did well

l        ` `用於設定系統命令的輸出到變數,shell會將` `中的內容作為一個系統命令並執行質。

              例如:echo `date` 則列印當前的系統時間。

l        \ 用來屏蔽特殊含義的字元:&  *  +  ^  $  `  “  |  ?

例如:expr 12 \* 12 將輸出144 變數設定時的不同模式:

valiable_name=value           設定實際值到 variable_name中

valiable_name+value           如果設定了variable_name,則重設其值

valiable_name:?value           如果未設定variable_name,則先顯示未定義使用者錯誤資訊

valiable_name?value           如果未設定variable_name,則顯示系統錯誤資訊

valiable_name:=value   如果未設定variable_name,則設定其值

valiable_name-value            同上,但取值並不設定到variable_name 條件測試

test命令用於測試字串、檔案狀態和數字,expr測試和執行數值輸出。

Test格式:test condition 或 [ condition ](需要特別注意的是condition的兩邊都要有一個空格,否則會報錯),test命令返回0表示成功。

l        下面將分別描述test的三種測試:

n        檔案狀態測試(常用的)

-d           測試是否檔案夾

-f            測試是否一般檔案

-L          測試是否連結檔案

-r           測試檔案是否可讀

-w         測試檔案是否可寫

-x           測試檔案是否可執行

-s           測試檔案是否非空

n        字串測試

五種格式: test  “string”

                            test  string_operator  “string”

                            test  “string”  string_operator  “string”

                            [ string_operator  “string” ]

                            [ “string”  string_operator  “string” ]

其中string_operator可以為:       =     兩字串相等

                                                               !=    兩字串不等

                                                               -z   空串

                                                               -n   非空串

n        數值測試

兩種格式: “number”  number_operator  “number”

                            [ “number”  number_operator  “number” ]

其中:number_operator 可以為:-eq  、-ne、-gt、-lt、-ge

例如:  NUMBER=130

                     [ “990”  –le  “995”  –a  “NUMBER”  -gt  “133” ]

                     (其中-a表示前後結果相“與”)

l        expr命令一般用於整數值,但也可以用於字串。

n        格式:  expr srgument operator operator argument

例如:  expr 10 + 10

              expr 10 ^ 2 (10的平方)

              expr $value + 10

n        增量計數――expr在迴圈中最基本的用法

例如:  LOOP=0

              LOOP=`expr $LOOP + 1`

n        模式比對:通過指定的冒號選項計算字串中的字元數

例如:  value=account.doc

              expr $value : `\(.*\).doc`

              輸出 account 命令執行順序

&&               成功執行一個命令後再執行下一個

||                    一個命令執行失敗後再執行另一個命令

( )                  在當前shell中執行一組命令(格式:(命令1;命令2; ……))

{ }                同( )

       例如:  comet mouth_end || ( echo “hello” | mail dave ;exit )

             如果沒有( ),則shell將直接執行最後一個命令(exit) 指令碼調試

最有用的調試指令碼的工具是echo命令,可以隨時列印有關變數或操作的資訊,以協助定位錯誤。也可使用列印最後狀態($?) 命令來判斷命令是否成功,這時要注意的是要在執行完要測試的命令後立即輸出$?,否則$?將會改變。

Set命令也可以用來輔助指令碼測試:

Set –n           讀命令但是不執行

Set –v           顯示讀取的所有的行

Set –x           顯示所有的命令及其參數

(要關閉set選項,只要把-換成+就可以了,這裡有點特殊,要注意一下)

 

  一些常用的小trick 列印一些頭資訊

command  <<  dilimiter

……

……

dilimiter

以分界符號dilimiter中的內容作為命令的標準輸入

       常用在echo命令中,這樣就避免了沒輸出一行就要使用一個echo命令,同時,輸出格式的調整也相應變得簡單了。

       例如:  echo << something_message

************************************************

                                         hello, welcome to use my shell script

************************************************

                something_message

將在螢幕上輸出:

************************************************

                                         hello, welcome to use my shell script

************************************************

一、利用<<的分解符號性質還可以自動選擇菜單或實現自動的ftp傳輸

也就是利用分解符號的性質自動選擇菜單。

例如: ./menu_choose >>output_file 2>&1 <<Choose

             2

             3

             Y

             Choose

             則自動在執行指令碼的過程中一步步作出選擇:2,3,Y

<<這種性質決定了它是理想的訪問資料庫的有用工具,可以用它來輸入面對資料庫提示時所作的各種選擇。 建立一個長度為0的空檔案

執行 > file_name 命令或 touch file_name 命令。 一些常用的shell變數

$#          傳遞到指令碼的參數個數

$*          以一個單字串顯示所有向指令碼傳遞的參數(可大於9個)

$$          指令碼啟動並執行當前進程的ID號

$!           後台啟動並執行最後一個進程的ID號

$@        與$#相同,但使用時加引號,並在引號中返回每個參數

$-           顯示shell使用的當前選項

$?                 顯示最後命令的退出狀態,0表示無錯誤(這個變數也常常用來列印輸出,在指令碼調試時標記某個shell命令或某個函數是否正確執行,但是要注意,$?記載的是最近的函數或命令的退出狀態,因此列印時應該立即列印以獲得正確的資訊) $0的使用

在變數中有一種位置變數$n,用來存放函數調用或指令碼執行時傳入的參數,其中$0表示函數名或指令碼名,需要注意的是,這時的指令碼名傳遞的是包含全路徑的指令碼名。從$1-$9表示傳入的第一到第九個參數,這樣的參數表示不能多於九個,如果多於九個,可以使用下面將要提到的shift指令來讀取。

因為$0存放函數名或指令碼名,因此我們可以通過echo $0來輸出調用資訊,但是,由於存放的是全路徑名,我們可以利用一個shell命令來得到指令碼名,basename $0 將得到$0中名字的部分,而與之相反的,dirname $0將得到$0中路徑的部分。 Shift的運用 用head或tail指令指定查閱的行數

例如:查閱檔案前20行:  head –20 file_name

             查閱檔案後10行: tail –10 file_name

 

 

  awk使用規則

awk 是一種很棒的語言。awk 適合於文本處理和報表產生,它還有許多精心設計的特性,允許進行需要特殊技巧程式設計。與某些語言不同,awk 的文法較為常見。它借鑒了某些語言的一些精華部分,如 C 語言、python 和 bash(雖然在技術上,awk 比 python 和 bash 早建立)。awk 是那種一旦學會了就會成為您戰略編碼庫的主要部分的語言。

  第一個 awk

讓我們繼續,開始使用 awk,以瞭解其工作原理。在命令列中輸入以下命令:

$ awk '{ print }' /etc/passwd

您將會見到 /etc/passwd 檔案的內容出現在眼前。現在,解釋 awk 做了些什麼。調用 awk 時,我們指定 /etc/passwd 作為輸入檔案。執行 awk 時,它依次對 /etc/passwd 中的每一行執行 print 命令。所有輸出都發送到 stdout,所得到的結果與與執行catting /etc/passwd完全相同。

現在,解釋 { print } 代碼塊。在 awk 中,花括弧用於將幾塊程式碼群組合到一起,這一點類似於 C 語言。在代碼塊中只有一條 print 命令。在 awk 中,如果只出現 print 命令,那麼將列印當前行的全部內容。

       這裡是另一個 awk 樣本,它的作用與上例完全相同:

            

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.