標籤:
由於工作需要,之前的幾個月寫了一些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 |
小於 |
邏輯運算子,
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編程總結