linux循环条件,shell脚本编写 之 条件选择,条件判断,循环语句
1 概述
編寫shell腳本,一般離不開條件選擇,條件判斷以及循環語句。掌握這三個語法,將大大提高腳本的編寫效率,使得腳本編寫更加靈活,完成X相對復雜的工作
2 條件選擇if語句
if語句選擇執行,逐條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句
if是根據判讀條件的命令的退出狀態來執行命令,if語句可嵌套
單分支
if?判斷條件;then
條件為真的分支代碼
fi
雙分支
if?判斷條件;?then
條件為真的分支代碼
else
條件為假的分支代碼
fi
多分支
if?判斷條件1;?then
條件為真的分支代碼
elif?判斷條件2;?then
條件為真的分支代碼
elif?判斷條件3;?then
條件為真的分支代碼
else
以上條件都為假的分支代碼
fi
例子
比較數字大小結果真假判斷
read?-p?"Please?input?nu:?"?nu
[[?$nu?=~?^[0-9]+$?]]?||?{?echo?"Your?input?is?not?num";exit?8;?}
if?[?"$nu"?-gt?90?];then
echo?"$nu?is?bigger?than?90"
elif?[?"$nu"?-lt?50?];then
echo?"$nu?is?less?than?50"
else
echo?"Your?input?$nu?is?between?range?50-90"
fi
執行命令結果真假判斷
read?-p?"please?input?ip:?"?ip
if??ping?-c?1?-W?1?$ip?&>/dev/null;?then
echo?"$ip?is?up"
elif?grep?"$ip"?/root/list?&>/dev/null
then
echo??"host?"$ip"?is?under?maitenance"
else??echo?"$ip?is?unexpectedly?down,please?check"
fi
3 條件判斷:case語句
語法如下
case?變量引用($var,注意有$符號引用)??in
PAT1)
分支1
;;
PAT2)
分支2
;;
......
*)
默認分支
;;
esac
這里的分支x可以是命令的組合,不是單純的一條命令
case支持glob風格的通配符:
*: 任意長度任意字符
?: 任意單個字符
[]:指定范圍內的任意單個字符
a|b: a或b,當匹配到不同的字符,但是要執行相同的分支命令是,可以用這個命令簡化判斷
例子
#!/bin/bash
read?-p?"Please?input?your?choice:?"?choice
final=`echo?"$choice"?|tr?[[:upper:]]?[[:lower:]]`
case?$final?in
y|yes)
echo?"You?input?"$choice",and?your?choice?is?yes"
;;
n|no)
echo?"You?input?"$choice",and?your?choice?is?no";
;;
y???es)
echo?"You?input?$choice,it?has?three?character?between?yes"
;;
[sunny])
echo?"You?input?$choice,it?only?has?one?character"
;;
*)
echo?"Your?choice?is?$choice,it?is?not?the?answer"
;;
esac
截圖如下
4 循環語句
將某代碼段重復運行多次,以下三個關鍵字for, while, until各自的語法構成不同的循環語句
其中
for默認將列表的值依次執行完成后退出
while和until有進入條件和退出條件
重復運行的次數有兩類
a.循環次數事先已知
b.循環次數事先未知
4.1 for 循環
4.1.1 for 常規的列表循環
語法如下:
for?變量名?(如?var,不需要加$引用變量值)?in?列表;do
循環體(命令組合)
done
for循環執行機制:
依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
for循環 列表 生成方式:
(1) 直接給出列表
(2) 整數列表:
(a) {start..end}
(b) $(seq[start [step]] end)
(3) 返回列表的命令:$(COMMAND) 可以表達為`COMMAND`,反向單引號引起來
(4) 使用glob,如:*.sh
(5) 變量引用;$@, $*
4.1.2 例子:
4.1.2.1 直接給出列表型
i=1
for?var?in?a?b?c?d
do
echo?"$i?cycle?the?var?is?$var"
let?i++
done
4.1.2.2 整數列表:{start..end..step}型
如果不指定步進值(step),那么默認是步進1
i=1
for?var?in?{3..15..2}
do
echo?"$i?cycle?the?var?is?$var"
let?i++
done
4.1.2.3 整數列表:$(seq[start [step]] end) 型
#如果是 seq end? 從1開始遞增到end,每次增加1
#如果是 seq start end? 從start開始遞增到end,每次遞增1
#如果是 seq[start] [step] [end] 從start開始,每次遞增step,直到end
i=1
for?var?in?$(seq?3?2?9)
do
echo?"$i?cycle?the?var?is?$var"
let?i++
done
4.1.2.4 返回列表的命令 $(COMMAND)型
for?var?in?$(ls?/root/)
do
echo??"$i?file?is?"$var",?type?is?`file?/root/$var`"
let?i++
done
echo
4.1.2.5 使用glob,如:*.sh或/root/* 型
for?var?in?/root/*
do
echo??"$i?file?is?"$var",?type?is?`file?$var`"
let?i++
done
echo
4.1.2.6 變量引用;$@, $*型
for?var?in?$@
do
echo??"$i?cycle,and?now?para?is?$1,var?is?$var,\$@?is?$@"
let?i++
shift
done
echo
4.1.3 ?for循環的特殊格式:
語法如下
for?((控制變量初始化;條件判斷表達式;控制變量的修正表達式))
do
循環體
done
控制變量初始化:僅在運行到循環代碼段時執行一次
控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷
雙小括號方法,即((…))格式,也可以用于算術運算
雙小括號方法也可以使bash Shell實現C語言風格的變量操作,如((I++))
該for循環的執行過程如下
進入循環的時候,先不判斷真假,直接執行 控制變量初始化
然后執行? 條件判斷表達式 ,會判斷真假 ,條件為真,開始進入循環
執行循環
執行完循環后
執行? 控制變量的修正表達式
然后條件判斷表達式
執行? 控制變量的修正表達式
然后條件判斷表達式,
。。。。。。。
直到不滿足條件判斷表達式這個條件后退出循環
邏輯圖如下
例子
read?-p?"Please?input?your?nu?to?cal?1+2+...+nu:?"?nu
s=0
for?((i=1;i<=$nu;i=i+1))
do
s=$(($s+$i))
echo?"it?is?the?$i?cycle."
done
echo?"1+2...+$nu=$s"
以上腳本通過調試 bash -x 結果截圖如下
4.2 while循環
4.2.1 語法
while?CONDITION(條件判斷);?do
循環體
done
CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;
條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環
因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正
進入條件:CONDITION為true
退出條件:CONDITION為false
4.2.2 while循環的特殊用法:
4.2.2.1 讀入文件
while?read?line;?do??//注意,這里的line只是變量,可以自己命名
循環體
done?
依次讀取/PATH/FROM/SOMEFILE這個文件中的每一行,且將行賦值給變量line,每次讀入一行進入循環,進行相應的處理
4.2.2.2 將結果傳入while
將命令的結果傳給while,用管道來傳,每次讀入命令結果得到一行
命令?|?while?read?變量; do
循環體
其中管道命令只能處理標準輸出,所以要確保命令有標準輸出
done
4.2.2.3 創建無限循環
while?true;?do
循環體
done
4.2.3例子
4.2.3.1 普通循環 九九乘法表
i=1
while?[?"$i"?-lt?10?];do
for?((?j=1;j<="$i";j++))?do
echo?-e?-n?"$i*$j=$[?$i*$j?]\t"
done
echo
let?i++
done
4.2.3.2 讀入文檔內容
while 每一次會把輸入的文檔/root/tt的每一行輸入進行處理,等這行完成處理后,
再輸入文檔的下一行,直到所有的循環都結束
i=1
while?read?line;do
echo?"$i?cycle?is?\$line?is?"
let?i++
echo?"$line"?|?grep?gt
echo?"$line"?|?sed?-nr?'s/useage=.*/for?test?sed/p'
echo
done
4.2.3.3 管道輸入
以下命令將 df|grep /dev/sd 的結果通過管道一行一行傳入給到變量line。然后進入循環做處理
df|grep?/dev/sd??|?while?read?line;do
dev=`echo?"$line"|?cut?-d?"?"?-f1`
use=`echo?"$line"|?sed?-r?'s/.*?([0-9]+)%.*/\1/'`
if?[?"$use"?-gt?3?];then
echo?"Warning?"$dev"'s?usage?is?over?3%,it?is?$use,please?check"
else
echo?""$dev"'s?usage?is?safe,it?is?$use"
fi
done
4.2.3.4 創建循環體
每個兩秒打印hello
while?true;do
echo?hello
sleep?2
done
4.3 until
4.3.1 語法
until?CONDITION;?do
循環體
done
進入條件:CONDITION 為false
退出條件:CONDITION 為true
until就是和while相反,一般可以用until實現的循環,都可以用while來實現,所以until可以了解一下即可。
創建無限循環
until?false;?do
循環體
Done
4.3.2 例子
4.3.2.1 until普通循環
當i大于6的時候進入循環,小于或者等于6的時候退出循環
i=10
until?[?$i?-le?6?];do
echo?\$i?is?$i,bigger?than?6
let?i--
echo?"after?i--,now?i?is?$i"
echo
done
4.3.2.2 無效循環的腳本
打印it is false,然后睡2秒
until?false?;do
echo?"it?is?false"
sleep?2
done
5 小結
使用什么語法進行循環,或者是條件選擇或者條件判斷,都要根據具體情況來定,同時也是根據個人寫腳本的習慣而定,比如有些人就喜歡用while來寫循環語句,但是有一個原則就是,盡量把算法定好,防止多次的循環,占用大量的資源,對系統造成負擔。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的linux循环条件,shell脚本编写 之 条件选择,条件判断,循环语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux dns配置bind9,DNS
- 下一篇: 国产浏览器 linux,360安全浏览器