目 錄
一、 if
二、 case
三、 for
四、 while
五、 until
六、 綜合應用
(1)單分支
if 判斷條件;then
fi
(2)雙分支
if 判斷條件; then
條件為真的分支代碼
else
條件為假的分支代碼
(3)多分支
if 判斷條件1; then
elif 判斷條件2; then
elif 判斷條件3; then
else
以上條件都為假的分支代碼
fi
逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而後結束整個if語句
2、例子1:編寫腳本,實作如下功能:當輸入的是自然數,提示是自然數,如果輸入不是,則提示,輸入不是自然數。
<code>#!/bin/bash</code>
<code># ---------------------------------------------------------------</code>
<code># Filename:checkint.sh</code>
<code># Revision: 1.0</code>
<code># Date: 2017-09-12</code>
<code># Author: gm</code>
<code># Website:</code>
<code># Description:check int</code>
<code># -------------------------------------------------------------</code>
<code>read</code> <code>-p </code><code>"please input number: "</code> <code>num</code>
<code>if</code> <code>[[ </code><code>"$num"</code> <code>=~ [^[:digit:]] ]];</code><code>then</code>
<code> </code><code>echo</code> <code>"The number is not a int"</code>
<code>else</code>
<code> </code><code>echo</code> <code>"The number is a int"</code>
<code>fi</code>
執行結果:
1、文法
case 變量引用 in
PAT1)
分支1
;;
PAT2)
分支2
...
*)
預設分支
esac
case支援glob風格的通配符:
*: 任意長度任意字元
?: 任意單個字元
[]:指定範圍内的任意單個字元
a|b: a或b
2、例子2:寫出菜單,當使用者輸入菜單編号,則顯示出價格
<code># ------------------------------------------</code>
<code># Filename: menu.sh</code>
<code># Revision: 1.0</code>
<code># Date: 2017-9-11</code>
<code># Description: cai dan</code>
<code>echo</code> <code>"menu</code>
<code>1.tang </code>
<code>2.rice </code>
<code>3.fruit </code>
<code>4.jiaozi </code>
<code>5.lamian </code>
<code>6.huimian </code>
<code>" </code>
<code>read</code> <code>-p </code><code>"plaese input your food number: "</code> <code>num</code>
<code>case</code> <code>$num </code><code>in</code>
<code>1|4)</code>
<code> </code><code>echo</code> <code>The price is 20</code>
<code> </code><code>;;</code>
<code>2|5)</code>
<code> </code><code>echo</code> <code>The price is 12</code>
<code>3|6) </code>
<code> </code><code>echo</code> <code>The price is 10</code>
<code>*)</code>
<code> </code><code>echo</code> <code>Please input again</code>
<code> </code><code>;; </code>
<code>esac</code>
解釋:通過讀取使用者輸入的數字;如果是1或4 ,提示The price is 20 。因為2号商品和4号商品價格一樣,可以寫在一起。case支援glob風格。當不滿足以上三個case時,用*)表示出以上情況,其他的輸入都提示 Please input again
執行結果:
for 變量名 in 清單;do
循環體
done
清單生成方式:
(1) 直接給出清單
例子3:列印1,2,3
<code># Filename: a.sh</code>
<code># Date: 2017-09-17</code>
<code># Description: echo 1,2,3</code>
<code>for</code> <code>line </code><code>in</code> <code>1 2 3;</code><code>do</code>
<code> </code><code>echo</code> <code>$line</code>
<code>done</code>
解釋:line是變量名,可以換成其他名
執行結果:
(2) 整數清單:
(a) {start..end}
例子4:計算1+2+3+...+100
<code># Filename: aa.sh</code>
<code># Description:1+2+3+...+100 </code>
<code>sum</code><code>=0</code>
<code>for</code> <code>i </code><code>in</code> <code>{1..100};</code><code>do</code>
<code> </code><code>let</code> <code>sum</code><code>=</code><code>sum</code><code>+i</code>
<code>echo</code> <code>$</code><code>sum</code>
解釋:let 使用于變量的運算
執行結果:
(b) $(seq [start[step]] end)
例子5:計算1+2+3+...+100
<code># Filename: bb.sh</code>
<code># Description:</code>
<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 100`;</code><code>do</code>
解釋:seq 1 100 顯示出1-100個數,$(command)或者`command` 引用指令執行的結果。$(seq 1 100)将指令執行的結果作為清單
(3) 傳回清單的指令
$(COMMAND)
(2)中的seq也是指令的引用
(4) 使用glob, 如: *.sh
例子6:依次顯示出/var/log/下所有以.log 結尾檔案的行數
<code># Filename: cc.sh</code>
<code># Description:/var/log/*.log</code>
<code>for</code> <code>file</code> <code>in</code> <code>/var/log/</code><code>*.log;</code><code>do</code>
<code> </code><code>wc</code> <code>-l $</code><code>file</code>
(5) 變量引用;
$@, $*
<code># Filename: dd.sh</code>
<code># Description:1+2+3+..+n</code>
<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 $1`;</code><code>do</code>
解釋:引用使用者輸入參數作為清單,$1表示使用者輸入的第一個參數。更加的靈活,注意:這裡不能使用{1..$1},{}引用變量顯示不出來,可以用`seq 1 $1`。
執行結果:
while CONDITION; do
循環體
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之後會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀态為“false”終止循環
例子1:
<code># Filename: ee.sh</code>
<code>while</code> <code>true</code><code>;</code><code>do</code>
<code> </code><code>echo</code> <code>"hello"</code>
解釋:true 一直為真,是以會一直執行循環體,是以這是個死循環。而且執行後,最好立即按ctrl+c停下,這是個死循環,不會自己停下,最終會造成系統資源耗盡而四級
執行結果:由于執行速度太快,我迅速按下ctrl+c後已經向上翻不到執行腳本的指令了,執行腳本指令./dd.sh
例子2:計算1+2+3+…+100
<code># Filename: ff.sh</code>
<code>i=1</code>
<code>sum</code><code>=0 </code>
<code>while</code> <code>[ $i -</code><code>le</code> <code>100 ];</code><code>do</code>
<code> </code><code>let</code> <code>i++</code>
解釋:當i小于或等于100時,執行下面操作。
until CONDITION; do
進入條件: CONDITION 為false
退出條件: CONDITION 為true
例子:當發現系統中有使用者名為hacker ,立即讓該使用者登出
<code># Filename: login.sh</code>
<code># Date: 2017-09-13</code>
<code># Description: test user login</code>
<code>until</code> <code>who</code><code>|</code><code>grep</code> <code>-q </code><code>"^hacker\>"</code><code>;</code><code>do</code>
<code> </code><code>sleep</code> <code>1</code>
<code>pkill -9 -u hacker</code>
解釋:who|grep -q "^hacker\>" 查找使用者名為hacker,當沒有找到時,一直循環,休眠1秒,sleep 1,一旦發現hacker使用者。直接讓使用者登出,腳本執行完立即退出
執行結果:當登入上hacker使用者後,
執行該腳本,立即執行完
再次檢視hacker登入,已經被踢出登入
1、對于上面例子中的menu,使用者隻能輸入一次就退出,這裡通過多種文法相結合,實作使用者多次輸入(while 與case結合)
<code># Filename:menu.sh</code>
<code># Revision: 1.0</code>
<code># Date: 2017-9-11</code>
<code># Description: caidan</code>
<code>1.yangroutang </code>
<code>2.mifan </code>
<code>3.hulatang </code>
<code>while</code> <code>read</code> <code>-p </code><code>"plaese input your food number(quit is exit): "</code> <code>num;</code><code>do</code>
<code> </code><code>case</code> <code>$num </code><code>in</code>
<code> </code><code>1|4)</code>
<code> </code><code>echo</code> <code>The price is 20</code>
<code> </code><code>;;</code>
<code> </code><code>2|5)</code>
<code> </code><code>echo</code> <code>The price is 12</code>
<code> </code><code>3|6) </code>
<code> </code><code>echo</code> <code>The price is 10</code>
<code> </code><code>quit) </code>
<code> </code><code>exit</code>
<code> </code><code>*)</code>
<code> </code><code>echo</code> <code>Please input again</code>
<code> </code><code>esac</code>
執行結果:
2、列印棋盤(for 和case 結合)
<code># Filename:xiangqi.sh </code>
<code># Description: </code>
<code>huang=`</code><code>echo</code> <code>-e </code><code>"\033[1;43m \033[0m"</code><code>`</code>
<code>lan=`</code><code>echo</code> <code>-e </code><code>"\033[1;44m \033[0m"</code><code>`</code>
<code>hong=`</code><code>echo</code> <code>-e </code><code>"\033[1;41m \033[0m"</code><code>`</code>
<code>for</code> <code>i </code><code>in</code> <code>{1..24};</code><code>do</code>
<code> </code><code>num=`</code><code>echo</code> <code>$[($i-1)</code><code>/3</code><code>]`</code>
<code> </code><code>mo=$[num%2]</code>
<code> </code><code>case</code> <code>$mo </code><code>in</code>
<code> </code><code>0) </code>
<code> </code><code>for</code> <code>j </code><code>in</code> <code>{1..4};</code><code>do</code>
<code> </code><code>echo</code> <code>-n </code><code>"$huang$lan"</code>
<code> </code><code>done</code>
<code> </code><code>echo</code>
<code> </code><code>echo</code> <code>-n </code><code>"$lan$huang"</code>
<code> </code><code>esac</code>
<code> </code>
<code>unset</code> <code>huang lan hong num</code>
本文轉自 hawapple 51CTO部落格,原文連結:http://blog.51cto.com/guanm/1966049