day67-shell編程之-while循環(huán)

循環(huán)語(yǔ)句常用于重復(fù)執(zhí)行一條指令或一組指令萧诫,直到條件不滿足停止,shell腳本語(yǔ)言的循環(huán)語(yǔ)句常見的有while枝嘶、until财搁、for、select循環(huán)語(yǔ)句躬络,其中,until和select已經(jīng)基本淡出歷史舞臺(tái)搭儒。本章講while循環(huán)
while循環(huán)語(yǔ)句主要用來(lái)重復(fù)執(zhí)行一組命令會(huì)語(yǔ)句穷当。在企業(yè)中常用于守護(hù)進(jìn)程或持續(xù)運(yùn)行的程序,特別是一些監(jiān)控任務(wù)淹禾。也有時(shí)候會(huì)用while來(lái)讀取文件的每一行內(nèi)容

1馁菜、while語(yǔ)法

while循環(huán)的基本語(yǔ)法為:

while <條件表達(dá)式>
do
    指令
done
或
while <條件表達(dá)式>;do
    指令
done

while循環(huán)會(huì)對(duì)緊跟在while后的條件表達(dá)式判斷,如果條件成立铃岔,就執(zhí)行while里面的命令或語(yǔ)句汪疮,每次執(zhí)行到done時(shí)候就重新判斷while表達(dá)式是否真的成立,直到表達(dá)式不成立才退出while循環(huán)體毁习,如果一開始就不成立智嚷,就不會(huì)進(jìn)入循環(huán)體。

2纺且、while循環(huán)執(zhí)行的流程圖如下所示:

3盏道、while按行讀入文件

while可以讀取指定的文件,然后可以對(duì)每行數(shù)據(jù)進(jìn)行自定義處理载碌,一共有三種方式:

3.1 exec方式猜嘱,僅供了解
exec < file
sum=0
while read line
do
    echo $line
done
3.2 cat方式
cat file | while read line
do 
    echo $line
done
3.3 <重定向輸入方式(推薦使用的方式)
while read line
do
    echo $line
done < file

4衅枫、while練習(xí):

4.1 while循環(huán)從1加到100,然后再額外使用兩種方式計(jì)算
方法1:echo "(1+100)*100/2"|bc

方法2:寫腳本
  9 i=0
 10 sum=0
 11 while [ $i -lt 100 ];do
 12     let i++
 13     let sum=${sum}+$i
 14 done
 15 echo $sum 
4.2 while循環(huán)讀入數(shù)據(jù)朗伶,計(jì)算文件內(nèi)的年齡平均值
[root@shelledu /server/scripts]# cat /server/txt/age.txt
jiaojiao 20
yingqian 20
jiangyuan 25
xiaolu 30
xuxu 18
dingsheng 38
lili 5
[root@shelledu /server/scripts]# 
[root@shelledu /server/scripts]# cat while-test02.sh
#!/bin/bash
#while循環(huán)讀入數(shù)據(jù)弦撩,計(jì)算文件內(nèi)的年齡平均值
num=0
sum=0
while read line
do
    let num++
    age=`echo $line|awk '{print $2}'`
    let sum=${sum}+${age}
done < /server/txt/age.txt
echo "共有 $num 人"
echo "年齡總共: $sum "
echo "年齡平均值: `echo ${sum}/${num}|bc`"
[root@shelledu /server/scripts]# 
[root@shelledu /server/scripts]# sh while-test02.sh
共有 7 人
年齡總共: 156 
年齡平均值: 22
[root@shelledu /server/scripts]# 
4.3 將” 打印菜單,按照選擇項(xiàng)一鍵安裝不同的web服務(wù)”腳本,改為死循環(huán)的形式论皆。菜單中加入選項(xiàng)exit益楼,只有輸入exit才能退出
[root@shell-project /server/scripts]# cat while-home01.sh
#!/bin/bash
# 將” 打印菜單,按照選擇項(xiàng)一鍵安裝不同的web服務(wù)”腳本,將其中的條件表達(dá)式修改成case或if語(yǔ)句

#定義變量
lamp="/server/scripts/lamp.sh"
lnmp="/server/scripts/lnmp.sh"

while true
do
    sleep 2
    clear
#打印菜單
cat << EOF
 1.[install lamp]
 2.[install lnmp]
 3.[exit]
EOF

#使用read讀取輸入
read -p 'please input the num you want: ' num
#定義函數(shù)
function lamp_lanp(){
    if [ -f "$1" ];then
        if [ ! -x "$1" ];then
            echo "$1 沒有執(zhí)行權(quán)限,不可執(zhí)行"
            exit 2
        else
            $1
        fi
    else
        echo "error: $1 is not exist."
        exit 3
    fi
}

case "$num" in
    "1")
        echo 'start installing lamp……'
        lamp_lanp $lamp
        ;;
    "2")
        echo 'start installing lnmp……'
        lamp_lanp $lnmp
        ;;
    "3")
        echo 'good byb!'
        exit
        ;;
    *)
        echo 'Input Error. Please enter again.'
esac
done
[root@shell-project /server/scripts]# 

5纯丸、案例實(shí)操

5.1 猜數(shù)字游戲:首先讓系統(tǒng)隨機(jī)生成一個(gè)數(shù)字偏形,給這個(gè)數(shù)字定一個(gè)范圍(1-100),讓用戶輸入猜的數(shù)字觉鼻,對(duì)輸入的數(shù)字進(jìn)行判斷俊扭,如果不符合要求,就給與高或低的提示坠陈,猜對(duì)后給出猜對(duì)用的次數(shù)萨惑,請(qǐng)用while語(yǔ)句實(shí)現(xiàn)
[root@shell-project /server/scripts]# cat while-home-caiziyouxi.sh
#!/bin/bash
#猜數(shù)字游戲:首先讓系統(tǒng)隨機(jī)生成一個(gè)數(shù)字,給這個(gè)數(shù)字定一個(gè)范圍仇矾,讓用戶輸入猜的數(shù)字庸蔼,對(duì)輸入的數(shù)字進(jìn)行判斷,如果不符合要求,就給與高或低的提示,猜對(duì)后給出猜對(duì)用的次數(shù)氢拥,請(qǐng)用while語(yǔ)句實(shí)現(xiàn)噪珊。
#定義變量
count=0
rnd=$(($RANDOM%100+1))

echo -e  "\E[1;31m=============歡迎進(jìn)入猜數(shù)字游戲============== \E[0m"    
while true;do
read -p "請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: " num
let count++
expr $num + 1 >/dev/null 2>&1
if [ $? -gt 0 ];then
    echo "輸入錯(cuò)誤,請(qǐng)看清楚提示!!"
else
    if [ $num -gt 100 -o $num -le 0 ];then
        echo "數(shù)字范圍在1-100之間,請(qǐng)重新輸入!"
    else
        if [ $num -gt $rnd ];then
            echo "猜的數(shù)字大了!!"
        elif [ $num -lt $rnd ];then
            echo "猜的數(shù)字小了B睢!"
        else
            echo -e "\E[1;31m恭喜你乙墙,猜對(duì)了S北洹!您猜對(duì)共用 $count 次. \E[0m"
            exit
        fi
    fi
fi
done
[root@shell-project /server/scripts]# 
[root@shell-project /server/scripts]# sh while-home-caiziyouxi.sh
=============歡迎進(jìn)入猜數(shù)字游戲============== 
請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: 50
猜的數(shù)字小了L搿腥刹!
請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: 70
猜的數(shù)字小了!汉买!
請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: 80
猜的數(shù)字大了8刈摺!
請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: 75
猜的數(shù)字大了!朽色!
請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: 73
猜的數(shù)字大了A谕獭!
請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: 72
猜的數(shù)字大了:小抱冷!
請(qǐng)您輸入你要猜的數(shù)字,范圍1-100: 71
恭喜你,猜對(duì)了I液帧旺遮!您猜對(duì)共用 7 次. 
[root@shell-project /server/scripts]# 
5.2 使用if和while實(shí)現(xiàn)菜單系統(tǒng)信息案例:

h 顯示命令幫助
f 顯示登錄信息
d 顯示磁盤掛載
m 查看內(nèi)存使用
u 查看系統(tǒng)負(fù)載
q 退出程序

[root@shell-project /server/scripts]# cat while-home-caidan.sh
#!/bin/bash
#使用if和while實(shí)現(xiàn)菜單系統(tǒng)信息案例
#定義函數(shù)
function print_info(){ 
cat <<EOF
    h:  [顯示命令幫助]
    f:  [顯示登錄信息]
    d:  [顯示磁盤掛載]
    m:  [查看內(nèi)存使用]
    u:  [查看系統(tǒng)負(fù)載]
    q:  [退出程序]
EOF
}
print_info

while true;do
read -p "請(qǐng)輸入要查詢的內(nèi)容: " cm
case "$cm" in
    "h")
        print_info
        ;;
    "f")
        who
        ;;
    "d")
        fdisk -l
        ;;
    "m")
        free -h
        ;;
    "u")
        w
        ;;
    "q")
        echo 'exit'
        exit
        ;;
    *)
        echo "參數(shù)錯(cuò)誤,請(qǐng)重新輸入"
esac
done
[root@shell-project /server/scripts]# 
5.3 while循環(huán)案例盈咳,可以批量創(chuàng)建10個(gè)用戶耿眉,并通過傳參方式傳入密碼123
創(chuàng)建用戶:
 useradd test1

添加密碼:
echo 123 | passwd --stdin test1
批量創(chuàng)建
seq 1 10

[root@shell-project /server/scripts]# cat while-home-adduser.sh
#!/bin/bash
#可以批量創(chuàng)建10個(gè)用戶,并通過傳參方式傳入密碼123
read -p "請(qǐng)輸入用戶名的前綴: " qian
read -p "請(qǐng)輸入要?jiǎng)?chuàng)建用戶的個(gè)數(shù): " num
expr $num + 1 >/dev/null 2>&1
if [ $? -gt 0 ];then
    echo '用戶個(gè)數(shù)請(qǐng)輸入正整數(shù)!'
    exit
fi
read -p "請(qǐng)輸入要?jiǎng)?chuàng)建用戶的密碼: " psd
if [ -n "$(echo "$psd" | sed 's#[0-9a-z]##g')" ];then
    echo '密碼只能輸入數(shù)字和小寫字母!'
    exit
fi
i=1
while [ $i -le $num ];do
    echo ${qian}$i
    name=${qian}$i
    let i++
    id $name >/dev/null 2>&1
    if [ $? -eq 0 ];then
        echo "$name 用戶已經(jīng)存在鱼响,創(chuàng)建失敗."
        continue
    else
        useradd $name
        echo "$psd"|passwd --stdin "$name"
        echo "$name 用戶創(chuàng)建成功."
    fi
done
[root@shell-project /server/scripts]# 
5.4 使用case和while循環(huán)批量刪除用戶[y|n]
[root@shell-project /server/scripts]# cat while-home-deluser.sh
#!/bin/bash
# 使用case和while循環(huán)批量刪除用戶[y|n]
while true;do    
    read -p "請(qǐng)輸入要?jiǎng)h除的用戶名: " name
    if [ -z $name ];then
        echo "對(duì)不起鸣剪,請(qǐng)輸入用戶名,否則不能刪除丈积!"
    elif [ $(grep "${name}:" /etc/passwd|wc -l) -eq 0 ];then
        echo "對(duì)不起筐骇,要?jiǎng)h除的用戶不存在!"
    else
        while true;do
            read -p "請(qǐng)確認(rèn)是否刪除["$name"] [y|n]? " sel
            case "$sel" in
                "y")
                    userdel $name 
                    read -p  "[$name]用戶刪除成功,是否繼續(xù) [yes|no]? " qus
                    if [ "$qus" = "yes" ];then
                        continue 2
                    fi
                    if [ "$qus" = "no" ];then
                        echo 'exit'
                        exit
                    fi
                    ;;
                "n")
                    echo 'exit'
                    exit
                    ;;
                *)
                    echo '輸入錯(cuò)誤江滨,請(qǐng)重新確認(rèn). '
            esac
        done
    fi
done
[root@shell-project /server/scripts]# 
5.5 while循環(huán)通過文本來(lái)直接創(chuàng)建用戶和密碼铛纬,如果用戶存在或者創(chuàng)建失敗給予提示
[root@shell-project /server/scripts]# cat /server/txt/user.txt
xiaohong 123456
wanghua 123456
lisisi 123456
xiaokeai 123456
yangguang 123456
[root@shell-project /server/scripts]# 
[root@shell-project /server/scripts]# cat while-home-adduserbytxt.sh
#!/bin/bash
#while循環(huán)通過文本來(lái)直接創(chuàng)建用戶和密碼,如果用戶存在或者創(chuàng)建失敗給予提示
#定義變量
while read line
do
    name=$(echo "$line"|awk '{print $1}')
    mima=$(echo "$line"|awk '{print $2}')
    if [ $(grep "${name}:" /etc/passwd|wc -l) -gt 0 ];then
        echo "$name 用戶已經(jīng)存在."
    else
        useradd "$name" >/dev/null 2>&1
        if [ $? -gt 0 ];then
            echo "$name 用戶創(chuàng)建失敗."
        else
            echo "$name 用戶創(chuàng)建成功."
            #修改密碼
            echo "$mima"|passwd --stdin "$name" >/dev/null 2>&1
            if [ $? -eq 0 ];then
                echo "$name 用戶密碼修改成功."
            else
                echo "$name 用戶密碼修改失敗."
            fi
        fi
    fi
done < /server/txt/user.txt
[root@shell-project /server/scripts]# 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末唬滑,一起剝皮案震驚了整個(gè)濱河市告唆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晶密,老刑警劉巖悔详,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惹挟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缝驳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門连锯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人用狱,你說我怎么就攤上這事运怖。” “怎么了夏伊?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵摇展,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我溺忧,道長(zhǎng)咏连,這世上最難降的妖魔是什么盯孙? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮祟滴,結(jié)果婚禮上振惰,老公的妹妹穿的比我還像新娘。我一直安慰自己垄懂,他們只是感情好骑晶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著草慧,像睡著了一般桶蛔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漫谷,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天仔雷,我揣著相機(jī)與錄音,去河邊找鬼抖剿。 笑死朽寞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斩郎。 我是一名探鬼主播脑融,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缩宜!你這毒婦竟也來(lái)了肘迎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锻煌,失蹤者是張志新(化名)和其女友劉穎妓布,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宋梧,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匣沼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捂龄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片释涛。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倦沧,靈堂內(nèi)的尸體忽然破棺而出唇撬,到底是詐尸還是另有隱情,我是刑警寧澤展融,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布窖认,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏扑浸。R本人自食惡果不足惜烧给,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望首装。 院中可真熱鬧创夜,春花似錦、人聲如沸仙逻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)系奉。三九已至檬贰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缺亮,已是汗流浹背翁涤。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萌踱,地道東北人葵礼。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像并鸵,于是被迫代替她去往敵國(guó)和親鸳粉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 一园担、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,734評(píng)論 0 10
  • 控制流 Swift提供了各種控制流程語(yǔ)句届谈。這些包括while循環(huán)多次執(zhí)行任務(wù); if,guard以及switch基...
    Fuuqiu閱讀 368評(píng)論 0 0
  • Shell入門 什么是shell弯汰? Shell其實(shí)是一個(gè)命令解釋器艰山,作用是解釋執(zhí)行用戶輸入的命令以及程序等,用戶每...
    酷酷的偉閱讀 422評(píng)論 0 1
  • 上節(jié)課我們已經(jīng)學(xué)會(huì)用if .. else 來(lái)猜年齡的游戲啦咏闪,但是只能猜一次就中的機(jī)率太小了曙搬,如果我想給玩家3次機(jī)會(huì)...
    小猿圈IT教育閱讀 587評(píng)論 0 0
  • 今天提及我沒有自信纵装,我的朋友問我,想想這幾年溪胶,值得你驕傲的事兒是什么?我左思右想稳诚,沒有哗脖。硬找出來(lái)一件事就是,我的經(jīng)...
    蘭萱之瑤閱讀 89評(píng)論 0 0