1、分享的目標shell
但願你們經過對本次分享內容的閱讀能夠了解SHELL,在平常工做中能經過SHELL實現簡單的功能,提升工做效率。本次分享的重點在案例分享部分,前面基礎部分是爲了讓SHELL基礎薄弱的同事經過閱讀學習能讀懂最後案例分享中腳本的內容。數據庫
2、分享的大綱編程
1.SHELL簡介bash
2.流程控制服務器
3.條件判斷框架
4.循環運維
5.算術運算編程語言
6.變量的做用域和經常使用隱含變量ide
7.簡單調試函數
8.案例分享(重點)
3、具體內容
1.SHELL簡介
SHELL自己是一個用C語言編寫的程序,它是用戶使用Unix/Linux的橋樑,用戶的大部分工做都是經過Shell完成的。SHELL既是一種命令語言,又是一種程序設計語言。做爲命令語言,它交互式地解釋和執行用戶輸入的命令;做爲程序設計語言,SHELL腳本和編程語言很類似,有變量和流程控制語句。SHELL腳本是解釋執行的,不須要編譯,SHELL程序從腳本中一行一行讀取並執行這些命令,至關於一個用戶把腳本中的命令一行一行敲到SHELL提示符下順序執行。
2.流程控制
(1).if 語句
提供條件測試。測試能夠基於各類條件。例如文件的權限、長度、數值或字符串的比較。這些測試返回值或者爲真(0),或者爲假(1)。基於此結果,能夠進行相關操做。
(2).case語句
容許匹配模式、單詞或值。一旦模式或值匹配,就能夠基於這個匹配條件進行相關操做。
3.條件判斷
(1).文件屬性的判斷
操做符 測試結果
-e filename 文件存在返回1,不然返回0
-r filename 文件可讀返回1,不然返回0
-w filename 文件可寫返回1,不然返回0
-x filename 文件可執行返回1,不然返回0
-o filename 文件屬於用戶本人返回1,不然返回0
-z filename 文件長度爲0返回1,不然返回0
-f filename 文件爲普通文件返回1,不然返回0
-d filename 文件爲目錄文件時返回1,不然返回0
(2).字符串比較
操做符 比較結果
str1 = str2 當兩個字串相等時爲真
str1 != str2 當兩個字串不等時爲真
-n str1 當字符串的長度大於0時爲真
-z str1 當字符串的長度爲0時爲真
str 當字符串爲非空時爲真
(3).數值比較(整數)
操做符 比較結果
num1 -eq num2 兩數相等爲真
num1 -ne num2 兩數不等爲真
num1 -gt num2 num1大於num2爲真
num1 -ge num2 num1大於等於num2爲真
num1 -lt num2 num1小於num2爲真
num1 -le num2 num1小於等於num2爲真
4.循環
循環是一系列命令的重複執行過程,經常使用的有3種循環語句:
(1).for 循環
每次依次處理列表內信息,直至循環耗盡。
例如:
for i in $(seq 1 10)
do
echo $i
done
(2).Until 循環
此循環語句不常使用,until循環直至條件爲真。條件部分在循環末尾部分。
例如:
i=1
until [ $i -gt 10 ]
do
echo $i
i=$(( $i + 1 ))
done
(3).While 循環
while循環當條件爲真時,循環執行,條件部分在循環頭。
例如:
i=1
while [ $i -le 10 ]
do
echo $i
i=$(( $i + 1 ))
done
5.算術運算
(1).整數運算
expr 例如:i=`expr 1 + 2`
(()) 例如:((i=1+2))
let 例如:let i=1+2
$[] 例如:i=$[1+2]
(2).浮點數運算
bc
特殊變量:
ibase,obase 用於進制轉換,ibase是輸入的進制,obase是輸出的進制,默認是十進制;
scale 小數保留位數,默認保留0位。
例如:
echo "scale=5;9+8-7*6/5^2"|bc 輸出:15.32000
echo "ibase=16;obase=2;ABC"|bc 輸出:101010111100
6.變量的做用域和經常使用隱含變量
(1).隨着代碼越寫越多,你開始把重複的邏輯提煉成函數。有可能你會掉到shell的一個坑裏。在shell中,若是不加local限定詞,變量默認都是全局的,但不多有 bash 教程一開始就告知你這個事實。在頂級做用域裏,是不是全局變量並不重要。可是在函數裏面,聲明一個全局變量可能會「污染」到其它做用域(尤爲在你根本沒有注意到這一點的狀況下)的同名變量。因此,對於在函數內聲明的變量,請務必記得加上local限定詞。
(2).經常使用隱含變量
$0 當前執行的腳本或者命令名稱
$1-$9 表明參數的位置. 舉例 $1 表明第一個參數.
$# 腳本調用的參數的個數
$@ 全部參數的內容
$* 全部參數的內容
$$ 當前運行腳本的進程號
$? 命令執行後返回的狀態
$! 後臺運行的最後一個進程號
注意:
$? 用於檢查上一個命令執行是否正確(命令退出狀態爲0表示該命令正確執行,任何非0值表示命令出錯)
$$ 變量最多見的用途是用作暫存文件的名字以保證暫存文件不會重複。
$* 和 $@ 若是輸出是同樣的,可是在使用for循環,在使用 雙引號("")引用時 "$*" 會輸
出成一個元素 而 "$@" 會按照每一個參數是一個元素方式輸出。
7.簡單調試
(1).檢查語法
-n 選項只作語法檢查,而不執行腳本。
例如:sh -n script_name.sh
(2).腳本調試執行
sh -x script_name.sh
進入調試模式後,Shell依次執行讀入的語句,產生的輸出中有的帶加號,有的不帶,以下
。帶加號表示該條語句是Shell執行的。不帶加號表示該語句是Shell產生的輸出。
(3).代碼塊調試上面的-x選項是調試整個腳本的,若是腳本很大,會很不方便,還有一種方法是調試某一塊代碼的,以下:
set -x
...
code block
...
set +x
這樣,只對set -x與set +x之間的代碼進行跟蹤。
(4).中斷調試,在調試過程當中能夠按Ctrl + Z中斷調試,觀察結果,而後再按fg鍵繼續調試便可。
8.案例分享(重點)
(1).簡介
如下案例是本人在實際工做中編寫的,主要是爲了提升客戶在環境搭建環節的工做效率。
(2).成果
a.未引入自動化安裝腳本以前搭建一套環境須要3人/天左右的時間(加上溝通協調等時間),並且常常會由於應用同事填寫的參數變量等不合理需不一樣程度的返工。
b.引入以後搭建一套環境只須要0.5人/天左右的時間,且下降返工的機率。
(3).引入自動化腳本以前環境的搭建流程
①.須要填寫複雜的數據庫配置文檔,大體以下:
......
②.須要將配置文檔提交給負責數據庫和操做系統的同事評審。
③.負責操做系統的同事須要從配置文檔中抽取、計算出來和系統相關的信息,搭建操做系統。
④.負責數據庫的同事須要根據配置文件提供的信息,按照標準步驟安裝部署環境,整個步驟有30多步,很是耗時。
⑤.安裝部署完成後檢查環境無問題提交給應用同事使用。
(4).引入自動化腳本以後環境的搭建流程
①.只需提交簡單的環境申請表格(詳情見附件一,表格中對所填寫的內容有嚴格的限制,確保填寫的內容有效。)
②.單擊「保存參數配置文件」按鈕,選擇配置文件保存路徑,自動生成操做系統配置文件new_system_config.txt(提供給操做系統的同事搭建環境)和生成數據庫配置文件new_db_config.txt(提供給數據庫的同時搭建環境)。
new_system_config.txt
new_db_config.txt
③.上傳數據庫配置文件new_db_config.txt和自動安裝腳本(附件二),調用安裝腳本,自動完成數據庫安裝、配置和環境的初始化。
(5).腳本主要實現功能以下,具體實現細節請參考附件二:
說明:腳本具備斷點從新開始的功能,運行過程當中遇處處理不了的錯誤腳本會輸出錯誤日誌,終止運行;人工根據輸出的錯誤日誌信息修復問題後可重跑安裝腳本,腳本會檢測已經完成的工做,從斷點位置開始執行,完成環境的安裝部署。
①.自動去FTP服務器取安裝包。
②.解壓安裝包,安裝數據庫。
③.添加數據庫許可。
④.建立數據庫實例。
⑤.配置數據庫環境變量、實例參數、數據庫參數。
⑥.重啓數據庫、備份數據庫使配置生效。
⑦.建立數據庫、建立BUFFERPOOL、建立表空間。
⑧.給應用用戶賦權(表空間使用權限、數據庫通用使用權限等、回收public權限)。
⑨.刪除系統自帶的臨時表空間和用戶表空間。
⑩.配置數據庫審計策略、開啓審計。
⑪.配置數據庫鎖監控。
⑫.配置數據庫dbtools腳本。
⑬.配置實例用戶crontab,經過做業循環調用數據庫監控腳本。
⑭.配置HA切換腳本。
⑮.設置應用用戶環境變量。
⑯.綁包、創建EXPLAIN表等
⑰.給應用用戶和db2_mon執行db2advis、db2expln權限。
⑱.清除安裝包。
⑲.退出腳本完成安裝配置。
⑳.人工檢查無問題後提交環境給應用同事使用。
附件一:新建數據庫申請表
附件二:數據庫自動安裝腳本
備註:SHELL腳本db2_ai.sh內容較多,時間有限腳本的註釋及函數的封裝寫的不是很好,還望見諒,若是閱讀過程當中有任何建議或疑問請及時聯繫,歡迎一塊兒探討。