前言
※1.1 爲什麼要學習shell編程
Shell腳本語言是實現Linux/UNIX系統管理及自動化運維所必備的重要工具,Linux/UNIX系統的底層及基礎應用軟件的核心大都涉及Shell腳本的內容。每一個合格的Linux系統管理員或運維工程師,都需要能夠熟練地編寫Shell腳本語言,並能夠約定系統及各類軟件附帶的Shell腳本內容。只有這樣才能提升運維人員的工作效率,適應日益複雜的工作環境,減少不必要的重複工作,從而爲個人的職場發展奠定較好的基礎。
1.2 學好Shell編程所需的基礎知識
學好Shell編程並通過Shell腳本輕鬆地實現自動化管理企業生產系統的必備基礎如下:
(1)能夠熟練使用vim編輯器,熟練SSH終端及”.vimrc”等的配置
(2)要有一定的Linux命令基礎,至少需要掌握80個以上Linux常用命令,並能夠熟練使用他們。
(3)要熟練掌握Linux正則表達式及三劍客命令(grep、sed、wak)
(4)熟悉常見的Linux網絡服務部署、優化、日誌分析及排除。
分支與循環
分支結構
※1.1單分支結構
對於if來說,簡單來說,其語義類似於漢語裏的“如果…..那麼”
第一種語法
if < 條件表達式 >
then
指令fi
第二種語法
if < 條件表達式 > ;then
指令
fi
條件表達式爲真,執行指令,爲假,不執行指令。
注:上文的“條件表達式”部分可以是test、[]、[[]]、(())、甚至可以把命令直接作爲條件表達式,命令執行成功,條件表達式就true,就可以執行指令。
★例1
if [ -d /etc/ ]
then
echo “/etc/ is a directory”
fi
輸出結果爲:/etc/ is a directory
[ -d /etc/ ] 是判斷/etc/是否爲目錄,顯然,根下的/etc/是目錄,所以爲真,執行echo “/etc/ is a directory “。
★例2
if hostname > /dev/null ;then
echo “it is successful”
fi
輸出結果爲:it is successful
在hostname &> /dev/null中hostname執行成功沒問題,然後把執行結果重定向/dev/null,/dev/null相當於一個黑洞,寫入裏面的內容永遠消失。我們只關心hostname這條命令是否執行成功,而不去管它的結果,因爲結果都寫入了黑洞,顯然,hostname命令執行成功,條件判斷爲真,執行指令echo “it is successful”
※ 1.2雙分支結構
if條件語句的單分支結構主體就是“如果…..,那麼……..”,而if條件語句的雙分支結構主體則爲“如果…….那麼…….”.
if 條件語句的雙分支結構語法爲:
if <條件表達式>;then
指令集1
else
指令集2
fi
★例3
num=10
if [[ $num -eq 10 ]];then
echo “10”else
echo “not 10”
fi
說明:給變量num賦值10 , [[ $num -eq 10 ]] 判斷變量的值是否等於10 , 等於10 , 執行echo “10” , 不等於10 , 執行 echo ” not 10 ” .
※ 1.3多分支結構
if 條件語句多分支結構的主體爲 “如果…… , 那麼…….. , 否則如果……..,那麼 , 那麼 , 否則如果….. , 那麼…… , 否則……” .
if條件語句多分支結構語法:
if <條件表達式1>;then
指令1
elif <條件表達式2>;then指令2
elif <條件表達式3>;then
指令3else
指令4
fi
是不是有暈呢 ? 下面舉個很貼近生活的例子 , 比如你就相當一個女孩兒
如果 <你有房>
那麼
我就嫁給你或者如果 <你爸有背景>
那麼
我也可以嫁給你
或者如果 <你很努力吃苦>
那麼
我們 可以先談談男女朋友
否則
不理你
果如
★例子4
if [[ -f $file ]];then
echo “$file is ordinary file “
elif [[ -d $file ]]
echo “$file is directory file “
elif [[ -L $file ]]
echo “$file is link file “
else
echo “$file is other file “
fi
說明:第一個判斷是 , 如果變量file是普通文件就執行echo “$file is ordinary file ” , 如果變量file是目錄文件就執行echo “$file is directory file ” , 如果變量是鏈接文件就執行echo “\$file is link file ” , 否則就執行echo “\$file is other file ” .
※ for循環
for 循環語句和while循環語句類似 , 但是for循環語句主要是用於執行次數有限的循環 , 而不是用於守護進程及無線循環 . for循環語句常見的語法有兩種 , 下面我們將一 一介紹 .
###
● 第一種 for 循環語句的結構如下:
for 變量名 in 變量取值列表 ; do
指令
done
for 後面有個”變量名” , 變量名依次獲取in關鍵字後面的變量取值列表內容 , 每次僅取一個 , 然後僅取一個 , 然後進入循環 do 和 done 之間的部分 , 執行循環內的所有指令 , 當執行單done時結束本次循環 . 之後 , “變量名” 再繼續獲取變量列表裏的下一個變量值 , 繼續執行循環內的所有指令 , 當執行到done時結束返回 . 以此類推 , 直到取完變量列表裏的最後一個值並進入循環執行到done結束爲止 .
★例5
計算從1加100的整數
#/bin/bash
sum=0
for i in {1..100}; do
let sum+=i
done
echo sum=$sum
腳本輸出結果:5050
說明:變量 i 依次從1到100裏面取數 , 取一次就進去循環 , sun 變量的值就加一次變量 i 取的值 , 加完之後結束一次循環 , 緊接着i 取下一個值 , 直到取到變量列表裏面的最後一個值100 , 加完循環結束 . 跳出for 循環 , 執行 echo sum= $sum , 輸出就爲5050 . 同學們可以用數學算法驗證下 , 這種計算方法出來的是否正確 , 如果數學計算這裏不再贅述 .
● 第二種for循環語句稱爲C語言型語句 , 其語法結構如下:
for 關鍵字後的雙口號內是三個表達式 , 第一個是變量初始化(例如:i=1) , 第二個爲變量的範圍(例如: i<100 ) , 第三個爲變量自增自減(例如: i++) . 當第一個表達式的初始化值符合第二個變量的範圍時 , 就進入循環執行 ; 當條件不滿足就退出循環 .
for (( expr1; exp2; exp3 ))
do
指令
done
★例6
for (( i=1 ; i<10 ; i++ ))
do
echo $i
done
輸出:1 2 3 4 5 6 7 8 9
說明: 變量i 初始化的值爲1 , 變量的範圍時1到10 , 並且小於10 , 自增 , 輸出1到9的整數 .
※while循環和until循環
循環語句命令常用於重複執行一條指令或一組指令 , 直到條件不再滿足時停止 , Shell腳本語言的循環語句常見的有 while util for 及 select 循環語句 .
while 循環語句主要用來重複執行一組命令或語句 , 在企業實際應用中 , 常用於守護進程或持續運行的程序 , 除此以外 , 大多數循環都會用到上文講解的for循環語句 .
while 循環語句的基本語法:
while <條件表達式>
do
指令…..
done
上文多次解釋條件表達式和指令 , 這裏和上文的用法類似 , 下面舉例來理解while 循環語句 .
★例7
同樣我們用while實現求1加到100的和
sum=0
while [[ i -le 100 ]];do
let sum+=i
let i++
done
echo sum=$sum
說明:條件表達式裏面規定 , 當i 小於等於100 時 , 執行let sum+=i 和 let i ++ ;當i 大於100 時 , 退出將不再執行指令 , 退出循環 . let sum+=i 表示 , sum = sum + i 每循環一次 , 執行一次 , let i++ 表示 每次i自增加1 . 循環結束 , 執行echo sum=$sum 命令 , 標準輸出 變量sum的值 .
※ case條件語句
case條件語句相當於多分支的if/elif/else條件語句 , 但是它比這些條件語句看起來
更規範更工整 , 常被應用與實現系統服務啓動腳本等企業應用場景中 .
在case 語句中 ,程序會將case獲取的變量的值與表達式部分的值1 值2 值3 等逐個
進行比較 , 如果獲取的變量值和某個值相匹配 , 就會執行值後面對應的指令 , 直到執
行到雙分號 ;; 才停止 , 然後再跳出case語句主體 , 執行case語句後面的其他命令 .
case 條件語句的語法:
case “變量” in
值1)
指令……
2)
指令…
*)
指令…..
esac
★例8
#!/bin/bash
read -p “Please choose yes or no :” choose
case $choose in
[Yy]|[Yy][Ee][Ss])
echo “your choose is yes “
[Nn]|[Nn][Oo])
echo “your choose is no “
*)
echo “please input yes or no “
case
說明:read -p “Please choose yes or no :” choose 提示用戶輸入一個值 , 並賦值變量shoose .
※ reak continue exit 的區別和對比
break continue 在條件語句及循環語句( for while if ) 中用於控制程序的走向 ; 而exit 則用於終止所有語句並退出當前 , 除此之外 , exit 還可以返回上一次程序或命令的執行狀態值給當前shell ; return類似於exit , 只不過return 僅用於在函數內部返回函數執行的狀態值 . 關於這幾個命令的基本說明如下表:
條件與循環控制及程序返回值命令知識
命令 | 說明 |
---|---|
break n | 如果省略n,則跳出整個循環,n表示跳出循環的層數 |
continue n | 如果省略n,則表示跳過本次循環,忽略本次循環的剩餘代碼,進入循環的下一次循環.n表示退到第n層繼續循環 |
exit n | 退出當前shell城西,n爲上一次程序執行的狀態返回值.n也可以省略,在下一個shell裏可通過”$?”接受exit的n值 |
return n | 用於在函數裏作爲函數的返回值,以判斷函數執行是否正確.在下一個shell裏可通過”$?”接受exit的n的值 |