為何要學編程中的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