Shell腳本編程中的if、case、for、while、until命令

為何要學編程中的if、case、for、while、until命令?

       作為一個運維工程師,總會聽到自動化,實際自動化離不開編寫shell腳本,而shell腳本中卻又離不開編程中的if、case、for、while、until,

這些關鍵字。

了解編程中的if、case、for、while、until命令,并能熟練編寫shell腳本是運維工程師的基本技能,今天要記錄的是“if、case、for、while、until”簡單使用。

(1)條件選擇if語句

簡介:
判斷“條件命令”列表,如果它的判斷語句為真,那么然后執行真的分支語句。否則,繼續判斷每個elif命令的判斷語句并依次執行的,如果某個分支的判斷
為真,就會執行真的分支代碼,如果判斷語句為假。相反執行假的分支語句。整個結構的退出狀態是執行的最后一個命令的狀態碼。
格式:
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
示例1:(單分支)
if 判斷條件;then
       條件為真的分支代碼
fi
示例2:(雙分支)
if 判斷條件; then
       條件為真的分支代碼
else
       條件為假的分支代碼
fi
示例3:(多分支)
if 判斷條件1; then
       if-true
elif 判斷條件2; then
       if-ture
elif 判斷條件3; then
       if-ture
       ...
else
       all-false
fi

Tips: 逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句
實例1:
ifping -c1 -W2 station1 &>/dev/null;then
echo 'Station1 is UP' elif grep "station1" ~/maintenance.txt &> /dev/null
then
echo 'Station1 is undergoing maintenance‘
else echo'Station1 is unexpectedly DOWN!' 
exit1
fi

(2)條件判斷:case語句

簡介:
基于字符串匹配模式的選擇地執行命令,可以用 “|”是用來分隔多個模式。
格式:
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
示例1:
case 變量引用in
PAT1)
     分支1
     ;;
PAT2)
     分支2
     ;;
...
*)
     默認分支
     ;;
esac

注意:
    case支持glob風格的通配符:
       *: 任意長度任意字符
       ?: 任意單個字符
      []:指定范圍內的任意單個字符
     a|b: a或b

(3)for 循環語句

簡介:
for命令有一個用來指明變量的特殊方法、一個必須保持成立才能繼續迭代的條件,以及另一個為每個迭代改變變量的方法;依次將列表中的元素賦值給“變量名”; 
每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束(執行機制)
格式:
for: for NAME [in WORDS ... ] ; do COMMANDS; done
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
示例1:
for 變量名 in 列表;do
    循環體
done

列表生成方式:
    (1) 直接給出列表
    (2) 整數列表:
            (a) {start..end}
            (b) $(seq[start [step]] end)
    (3) 返回列表的命令
            $(COMMAND)
    (4) 使用glob,如:*.sh
    (5) 變量引用:$@, $*

(4)while 循環語句

簡介:
while命令允許你定義一個要測試的命令,然后循環執行一組命令,只要定義的測試命令返回的是退出狀態碼0,它會在每個迭代的一開始測試test命令。在test命令返回
非零退出狀態碼時,while命令會停止執行那組命令。
格式:
while COMMANDS; do COMMANDS; done
示例1:
while CONDITION; do
        循環體
done


CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環
因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正(進入條件:CONDITION為true;退出條件:CONDITION為false)

示例2:創建無限循環
while true; do 循環體 done

(5)until 循環語句

簡介:
until命令和while命令工作的方式完全相反。until命令要求你指定一個通常輸出非零推出狀態碼的測試命令。只要測試命令的退出狀態碼非零,bash shell才會執行循環
中列出的那些命令。一旦測試命令返回了退出狀態碼0,循環就結束了。
格式:
until COMMANDS; do COMMANDS; done
示例1:
until CONDITION; do
        循環體
done

進入條件:CONDITION 為false
退出條件:CONDITION 為true

示例2:(創建無限循環)
until false; do 循環體 done

(6)循環控制語句continue命令

簡介:
continue命令是提早結束執行循環內部的命令但并不完全終止整個循環的一個途徑。它允許你在循環內部設置shell不執行命令的條件。
詳解:
continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

(7)循環控制語句break命令

簡介:
bread命令是退出進行中單個的循環語句
詳解:
break [N]:提前結束第N層循環,最內層為第1層

(8)使用read命令來接受輸入

簡介:
read命令從鍵盤讀取變量的值,通常用在shell腳本中與用戶進行交互的場合。該命令可以一次讀取多個變量的值,變量和輸入的值都需要使用空格隔開。在read命令后面,
如果沒有指定變量名,讀取的數據將被自動賦值給特定的變量REPLY。
格式:
read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)
實例1:
[root@centos6 scripts]# cat read.sh 
#!/bin/bash
#

read -p "Enter in a arguments: " arg

cat $arg
[root@centos6 scripts]# bash read.sh 
Enter in a arguments: /etc/issue
CentOS release 6.8 (Final)
Kernel \r on an \m

[root@centos6 scripts]#

(9)作業

1、寫個腳本,實現星三角

[root@centos6 scripts]# cat sanjiao.sh 
#!/bin/bash
termCols=`tput cols`
maxLineNum=`seq 1 2 $termCols | wc -l`
echo "#當前終端的寬度最多能夠正常打印$maxLineNum行"
read -p "#請輸入要打印的三角形的行數,行數范圍大于1小于等于$maxLineNum,請輸入行數: " lineNeeds
[[ `tput cols` -ne $termCols ]] && echo "終端寬度已經被改變,請重新運行腳本"  && exit
[[ $lineNeeds =~ ^[[:digit:]]+$ && $lineNeeds -ge 2 && $lineNeeds -le $maxLineNum ]]
[[ $? -ne 0 ]] && echo "輸入值不合法" && exit
for line in `seq 1 $lineNeeds`;do
   for ((kong=(lineNeeds-line);kong>0;kong--));do
      echo -n " "
   done
   for((xing=1;xing<=(line*2-1);xing++));do
      echo -n "*"
   done
      echo
done
[root@centos6 scripts]# bash sanjiao.sh 
#當前終端的寬度最多能夠正常打印79行
#請輸入要打印的三角形的行數,行數范圍大于1小于等于79,請輸入行數: 5
    *
   ***
  *****
 *******
*********
[root@centos6 scripts]#

2、用until循環實現國際象棋棋盤

[root@centos6 scripts]# cat xiangqi.sh 
#!/bin/bash
#
#
#
i=1

until [ $i -gt 8 ];do
	j=1
	while [ $j -le 8 ];do
		sum=`expr $i + $j`
		z=`expr $sum % 2`
		[ $z -eq 0 ] && echo -ne "\033[41;1m  \033[0m"||echo -ne "\033[43;1m  \033[0m"
		let j++
	done
	echo
	let i++
done
[root@centos6 scripts]#

原創文章,作者:Aleen,如若轉載,請注明出處:http://www.www58058.com/36994

(0)
AleenAleen
上一篇 2016-08-19
下一篇 2016-08-20

相關推薦

  • 第二十一周作業

    1、回顧并詳細總結MySQL的存儲引擎、索引; 常用存儲引擎的對比: 特點 MyISAM InnoDB MEMORY MERGE NDB 存儲限制 有 64TB 有 沒有 有 事務安全 支持 鎖機制 表鎖 行鎖 表鎖 表鎖 行鎖 B樹索引 支持 支持 支持 支持 支持 哈希索引 支持 全文索引 支持 集群索引 支持 數據緩存 支持 支持 支持 索引緩存 支持…

    2017-07-29
  • 第十一周作業

    1、詳細描述一次加密通訊的過程,結合圖示最佳。 一次通信加密過程: 發送方: 1.使用單向加密算法提取生成數據特征碼; 2.使用自己的私鑰加密特征碼附加在數據后面; 3.生成用于對稱加密的臨時密鑰; 4.用此臨時密鑰加密數據和已經使用私鑰加密后的特征碼; 5.使用接受方的公鑰加密此臨時密鑰,附加在對稱密鑰后的數據后方; 接受方: 1.使用自己的私鑰解密加密的…

    2017-10-02
  • free / buffer與cache

           前幾天看到有些伙伴傻傻分不清楚buffer與cache的用處,后來發現我也不能很清楚的說出來buffer與cache在不同的地方有什么不同之處,這里就總結了一些關于buffer于cache的區別,如有不完善的地方,請大家指出來。        說到buffer與ca…

    2017-07-17
  • 高可用keepalived結合haproxy代理WordPress(動靜分離)

    (1)A  B兩臺服務器做keepalived高可用,同時作為haproxy動靜分離后端代理。         (keepalived時主備模型,haproxy輪詢調度) (2)C 服務器搭建apache作為動態資源服務器 (3)D 服務器搭建nginx作為靜態資源服務器 (4)VIP:172.18.0.42…

    2017-05-20
  • 馬哥教育網絡第21期-第十四周課程練習

    系統的INPUT和OUTPUT默認策略為DROP; iptables -P INPUT DROP iptables -P OUTPUT DROP 1、限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問; web服務器僅允許…

    Linux干貨 2016-12-26
  • 第三周-作業

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。     ~]# who | cut -d" " -f1 | uniq 2、取出最后登錄到當前系統的用戶的相關信息。     ~]# who |  t…

    Linux干貨 2016-12-14
欧美性久久久久