一、分享的目標
希望大家通過對本次分享內容的閱讀可以瞭解SHELL,在日常工作中能通過SHELL實現簡單的功能,提高工作效率。本次分享的重點在案例分享部分,前面基礎部分是爲了讓SHELL基礎薄弱的同事通過閱讀學習能讀懂最後案例分享中腳本的內容。
二、分享的大綱
1.SHELL簡介
2.流程控制
3.條件判斷
4.循環
5.算術運算
6.變量的作用域和常用隱含變量
7.簡單調試
8.案例分享(重點)
三、具體內容
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內容較多,時間有限腳本的註釋及函數的封裝寫的不是很好,還望見諒,如果閱讀過程中有任何建議或疑問請及時聯繫,歡迎一起探討。