[shell] Bash編程總結

來源:互聯網
上載者:User

標籤:

由於工作需要,之前的幾個月寫了一些Bash指令碼,主要完成自動化的測試、打包、安裝包等。雖然相比C++編程,要簡單、傻瓜,但其在類Unix系統中可以大大提高工作的效率。所以在此對指令碼編程過程中一些注意事項進行簡單的總結。

1. shell 概述

shell是介於使用者和類Unix作業系統核心(kernel)之間的一個介面,是為了保護核心不被使用者誤操作造成損害,在核心的周圍建立一個外殼(shell

使用者通過向shell提出請求,shell解釋並將請求傳給核心。而多個shell請求可以寫在一個檔案中,便構成了shell指令碼,其自身是一個解釋型程式設計語言(相對編譯型程式設計語言),shell指令碼支援絕大多數的進階語言中能見到的程式元素,如函數、變數、數組和程式控制結構等,同時任何在Unix終端提示符能鍵入的命令都能放在shell指令檔中。

使用較廣的shell有:Bourne Again Shell(bash)、Bourne Shell(sh)、C Shell(csh)、Korn Shell(ksh)等,當前大部分Unix系統裡預設的shell都是bash

查看當前環境所用的shell:『echo $SHELL』。

查看當前發行版可以使用的shell:『cat /etc/shells』。

2. Bash 編程

shell指令檔格式,

 1 #!/bin/bash 2  3 function1() 4 { 5 } 6  7 function2() 8 { 9 }10 11 # 主程式12 echo “hello world” # 列印hello world13 ...14 ...15 ...

 

Bash中以$開頭的變數, 

$#

傳遞給指令碼的參數個數

$*

傳遞給指令碼的所有參數的值

[email protected]

同$*

$$

指令碼的進程號

$!

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

$-

顯示shell使用的當前選項

$?

顯示命令(或函數)的退出狀態,0為正確,1為錯誤

$0

shell指令碼的程式名(檔案名稱)

$n

指令碼程式(或函數)的第n個參數選項(從1開始)

 

字串操作,

${#str}

返回字串變數str的長度

${str:n}

返回str從第n個字元到最後的字串(n從0開始)

${str:n:len}

返回str從第n個字元開始,長度為len的字串(n從0開始)

${str#pattern}

刪除str中開頭部分與pattern匹配的最小部分

${str##pattern}

刪除str中開頭部分與pattern匹配的最大部分

${str%pattern}

刪除str中結尾部分與pattern匹配的最小部分

${str%%pattern}

刪除str中結尾部分與pattern匹配的最大部分

${str/old/new}

用new替換str中第一次出現的old

${str//old/new}

用new替換str中所有的old

${str/#old/new}

用new替換str首碼匹配到的old

${str/%old/new}

用new替換str尾碼匹配到的old

=

判斷兩個字串是否相同

!=

判斷兩個字串是否不相同

-n

判斷字串長度是否大於零

-x

判斷字串長度是否等於零

註:相比於awk、sed對字串的各種操作,shell內建的字串操作效能更高(最起碼,不需要啟動awk、sed等進程)。

 

檔案狀態的測試,

-d

是否為目錄

-f

是否為檔案

-L

是否為符號連結

-r

是否可讀

-w

是否可寫

-x

是否可執行

-a

是否不為空白

 

數值測試,

-eq

相等

-ge

大於等於

-le

小於等於

-ne

不等於

-gt

大於

-lt

小於

 

字串測試,

-eq

相等

-ge

大於等於

-le

小於等於

-ne

不等於

-gt

大於

-lt

小於

 

邏輯運算子,

!

邏輯取反

-a

邏輯與

-o

邏輯或

  3. 指令碼調試

sh -x a.sh

跟蹤指令碼的執行,對指令碼中每條命令先執行替換,然後顯示,再執行

sh -v a.sh

按輸入的原樣列印指令碼中的每行,列印一行執行一行

sh -n a.sh

對指令碼進行語法檢查,但不執行

  4. 一些技巧

屏蔽命令列印

cmd > /dev/null   # 屏蔽正常輸出

cmd 2> /dev/null  # 屏蔽錯誤輸出

cmd > /dev/null 2> /dev/null # 屏蔽正常輸出和錯誤輸出

cmd > /dev/null 2>&1     # 屏蔽正常輸出和錯誤輸出

cmd &> /dev/null        # 屏蔽正常輸出和錯誤輸出

命令是否執行成功

cmd && echo “failed” || echo “ok”

串連檔案1所有行

paste –sd “,” 1 # 用逗號串連

paste –sd “ ” 1 # 用空格串連

過濾檔案1重複行

sort -u 1

設定臨時環境變數

指令檔中export作用於當前指令碼程式,

VAR=env_str cmd環境變數只用於該cmd(無須先export,再unset)

字串預設值

${str:-0} # 如果str沒被聲明或為空白,設為0,可以用來判斷命令列或者函數參數

特殊參數--

echo “abc-a” | grep -- -i # --後面的參數不會被當作選項解析

擷取軟連結指向檔案

readlink file

清空檔案(或建立檔案)

echo “” > file

cat /dev/null > file

> file

shell中多進程

使用(cmd)可以fork一個子shell來執行該命令,利用wait命令,等待所有子進程結束

……

……

待今後繼續補充

 

 

[shell] Bash編程總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.