linux運(yùn)維零基礎(chǔ)學(xué)習(xí)資料:結(jié)構(gòu)化命令case和for刹泄、while循環(huán)

想要獲取更多學(xué)習(xí)資料,關(guān)注公眾號(hào)學(xué)神來啦

本節(jié)所講內(nèi)容:

21.1 ?case-流程控制語句

21.2 ?循環(huán)語句

21.3 ?while循環(huán)語句和循環(huán)嵌套

21.4 ?實(shí)戰(zhàn)-3個(gè)shell腳本實(shí)戰(zhàn)

21.1 ?流程控制語句:case

控制語句:用來實(shí)現(xiàn)對(duì)程序流程的選擇、循環(huán)蚤假、轉(zhuǎn)向和返回等進(jìn)行控制。case是開關(guān)語句的一個(gè)組成部分田绑;

它是根據(jù)變量的不同進(jìn)行取值比較勤哗,然后針對(duì)不同的取值分別執(zhí)行不同的命令操作

適用于多分支,是一個(gè)多選擇語句

case?????變量或表達(dá)式?????in

?????? ???????變量或表達(dá)式1)

?????????????????????命令序列1

?????????????????????掩驱;芒划;

????????????變量或表達(dá)式2)

?????????????????????命令序列2

?????????????????????;欧穴;

?????????????????????……

???????????????????? *)??

?????????????????????默認(rèn)命令序列

?esac

case語句執(zhí)行流程控制:

執(zhí)行流程:

首先使用“變量或表達(dá)式”的值與值1進(jìn)行比較民逼,若取值相同則執(zhí)行值1后的命令序列,直到遇見雙分號(hào)“涮帘;拼苍; ”后跳轉(zhuǎn)至esac,表示分支結(jié)束调缨;

若與值1不相匹配疮鲫,則繼續(xù)與值2 進(jìn)行比較,若取值相同則執(zhí)行值2 后的命令序列弦叶,直到遇見雙分號(hào)“俊犯;; ”后跳轉(zhuǎn)至esac伤哺,表示結(jié)束分支燕侠。

依次類推者祖,若找不到任何匹配的值,則執(zhí)行默認(rèn)模式“ *) ”后的命令序列绢彤,直到遇見esac后結(jié)束分支

注意事項(xiàng):

“變量或表達(dá)式”后面必須為單詞in七问,每一個(gè)“變量或表達(dá)式”的值必須以右括號(hào)結(jié)束。取值可以為變量或常數(shù)茫舶。匹配發(fā)現(xiàn)取值符合某一模式后械巡,其間所有命令開始執(zhí)行直至 ;;

匹配中的值可以是多個(gè)值,通過“|”來分隔

例1:編寫一個(gè)操作文件的腳本

[root@xuegod63 ~]# vim case1.sh

####################################################################

# File Name: case-1.sh

# Author: xuegod

####################################################################

#!/bin/bash

cat <<eof

****************

** 1. backup ?**

** 2. copy ???**

** 3. quit ???**

****************

eof

read -p "請(qǐng)輸入您的選擇: " OP

case $OP in

1|backup)

echo "BACKUP......"

;;

2|copy)

echo "COPY....."

;;

3|quit)

exit

;;

*)

echo error

esac

sh ?case1.sh

例2:編寫一個(gè)啟動(dòng)apache服務(wù)腳本

[root@xuegod63 ~]# yum -y?install httpd

[root@xuegod63 ~]# vim ?case2.sh

#!/bin/bash

case $1 in

????????start)

????????????????/usr/bin/systemctl $1 httpd

????????????????/usr/bin/ps aux | grep httpd | grep -v grep

????????????????echo "httpd start"

?????????????????????????;;

????????stop)

????????????????/usr/bin/systemctl $1 httpd

????????????????/usr/bin/ps aux | grep httpd | grep -v grep

????????????????echo "httpd stop"

?????????????????????????;;

????????restart)

????????????????/usr/bin/systemctl $1 httpd

????????????????/usr/bin/ps aux | grep httpd | grep ?-v grep

????????????????echo "httpd restart"

?????????????????????????;;

????????status)

????????????????/usr/bin/systemctl $1 httpd | grep -v grep

????????????????????????;;

????????*)

????????????????echo "please input start | stop | restart | status"

esac

[root@xuegod63 ~]# sh case2.sh

21.2 ?循環(huán)語句

21.2.1 ?for-do-done

語法格式:

for var in list ???#for后跟var(var相當(dāng)于一個(gè)變量)list(相當(dāng)于一個(gè)列表)

do

??commands

done

或:

for var in list ; do

??commands

done

取值列表有多種取值方式奇适,比如

可以直接讀取in 后面的值坟比,默認(rèn)以空格做分隔

[root@xuegod63 ~]# vim?for1.sh

#!/bin/bash

for var in a1 b1 c1 d1

do

echo the text is $var

done

列表中的復(fù)雜值,可以使用引號(hào)或轉(zhuǎn)義字符”\”來加以約束

[root@xuegod63 ~]# vim for2.sh ??

#!/bin/bash

for var in a1 b1 ?'c1 d1' ?e2 ?'hello world'

do

????????echo the text is $var

done

[root@xuegod63 ~]# vim?for3.sh

#!/bin/bash

for var in a1 b\'1 'c1 d1' e2 'hello world'

do

echo the text is $var

done

從變量中取值

[root@xuegod63 ~]# vim?for4.sh

#!/bin/bash

list="a1 b1 c1 d1"

for i in $list

do

echo list is a $i

done

4嚷往、從命令中取值

[root@xuegod63 ~]# vim?for5.sh ??#默認(rèn)以以空格做分隔符

#!/bin/bash

for i in `cat /etc/hosts`

do

echo "$i"

done

sh ??for-5.sh

127.0.0.1

localhost

localhost.localdomain

localhost4

localhost4.localdomain4

::1

localhost

localhost.localdomain

localhost6

localhost6.localdomain6

5葛账、自定義shell分隔符

默認(rèn)情況下,base shell會(huì)以空格皮仁、制表符籍琳、換行符做為分隔符。通過IFS來自定義為分隔符

指定單個(gè)字符做分隔符:

IFS=: ??#以:冒號(hào)做分隔符

可以指定多個(gè)

如 IFS='\n: "; ' ???#這個(gè)賦值會(huì)將反斜杠贷祈、n趋急、冒號(hào)、雙引號(hào)势誊、分號(hào)作為字段分隔符呜达。

注:$'\n'與'\n'時(shí)的區(qū)別

IFS='\n' ???#將字符\和字符n作為字段分隔符。

IFS=$'\n' ??#使用換行符做為字段分隔符粟耻。

[root@xuegod63 ~]# vim for6.sh??#指定以\n回車做為 for語句的分隔符

#!/bin/bash

IFS=$'\n'

for i in `cat /etc/hosts`

do

echo "$i"

done

?[root@xuegod63 ~]# vim for6.sh???#以:冒號(hào)做分隔符

#!/bin/bash

IFS=:

for i in `cat /etc/hosts`

do

echo $i

done

6查近、C語言風(fēng)格的for

語法格式:

for ((i=0;i<10;i++))

do

???commmands

done

例1:?jiǎn)蝹€(gè)變量 輸出1到10之間的數(shù)字

[root@xuegod63 ~]# vim for7.sh

#!/bin/bash

for ((i=1?;?i<=10 ;?i++ ?))

do

echo num is $i

done

for ((??i=1??;?i<=10 ?;??????))???#i=1 只賦值一次。然后執(zhí)行 i <= 10

do

echo num is $i

i=$(($i+1))????# i++在這里執(zhí)行挤忙。 當(dāng)for循環(huán)體中所有命令執(zhí)行完后霜威,再執(zhí)行i++

done

例2:多個(gè)變量。 同時(shí)輸出1-9的升序和降序

[root@xuegod63 ~]# vim for9.sh

#!/bin/bash

for ((a=1,b=9 ;a<10;a++,b--))

do

echo num is $a - $b

done

[root@xuegod63 ~]# vim for9.sh

#!/bin/bash

for ((a=1,b=9;a<10,b>5;a++,b--))

do

echo num is $a - $b

done

21.3 ?while循環(huán)語句和循環(huán)嵌套

21.3.1 ?while-do-done

重復(fù)測(cè)試指令的條件册烈,只要條件成立就反復(fù)執(zhí)行對(duì)應(yīng)的命令操作戈泼,直到命令不成立或?yàn)榧伲?/b>

語法格式如下:

while?測(cè)試命令

do

命令

done

注意:避免陷入死循環(huán) ?while true

例1:降序輸出10到1的數(shù)字

[root@xuegod63 ~]# vim while1.sh

#!/bin/bash

var=10

while [ $var -gt 0 ]

do

echo $var

var=$[$var-1]

?????#var=$(($var-1))

?????#let var--

done

例2:輸出如下圖兩數(shù)相乘的效果

自增操作 ?let var++ ?

自減操作 ?let var-- ?

[root@xuegod63 ~]# vim while2.sh

#!/bin/bash

num=1

while [ $num -lt 10 ]

do

????????sum=$(( ?$num * $num ))

????????echo ?"$num * $num = $sum"

????????((num++))

# ??????let num++

done

21.3.2 ?嵌套循環(huán)

例1:批量添加a.txt文件5個(gè)用戶

[root@xuegod63 ~]# vim?a.txt???#添加5個(gè)用戶

cp

cd

ls

find

ln

編寫腳本的思路

1 ?明確腳本的功能

2 ?編寫腳本時(shí)會(huì)使用到那些命令 ? ?useradd ???passwd ??for

3 ?把變化的數(shù)據(jù)使用變量表示

4 ?選擇適合的流程控制 ?(選擇 赏僧、 循環(huán) 大猛、分支)

[root@xuegod63 ~]# vim add.sh

#!/bin/bash

for name in `cat /root/a.txt`

#for name in $(cat /root/a.txt)

do

????????id $name &> /dev/null

????????if [ $? -ne 0 ];then

????????????????useradd $name

????????????????echo "123456" |passwd --stdin $name &> /dev/null

????????????????echo "user $name created"

????????else

????????????????echo "user $name is exist"

????????fi

done

注:&> 是正確和錯(cuò)誤的信息都重定向到/dev/null里面,相當(dāng)于1> /dev/null 2>&1 這個(gè)寫法

例2 :打印九九乘法表

注:外層循環(huán)循環(huán)行淀零,內(nèi)層循環(huán)循環(huán)列

規(guī)律: ?內(nèi)層循環(huán)的變量<=外層循環(huán)的變量

echo -n 代表不換行

[root@xuegod63 ~]# vim?forfor.sh

#!/bin/bash

for i in ?`seq 9`

do

?????????for j in `seq $i`

?????????do

??????????????echo ?-n ?"$i*$j= `echo $(($i*$j))` ?"

?????????done

????????echo " ?"

done

21.4 ?實(shí)戰(zhàn)-3個(gè)shell腳本實(shí)戰(zhàn)

21.4.1 ?實(shí)戰(zhàn)-將/opt目錄下所有的日志文件全自動(dòng)打包

[root@xuegod63 ~]# vim log-back.sh

#!/bin/bash

SRC_DIR=/var/log/

DES_DIR=/opt/backup/`date +%Y%m%d`

#如果目標(biāo)目錄不存在胎署,則創(chuàng)建目標(biāo)目錄

if

[ ! -d ?$DES_DIR ] ; then

????????mkdir -p $DES_DIR

fi

#遍歷找到的日志文件并打包

for i in ?`find ?$SRC_DIR ?-name "*.log"`

do

????????tar ?czf ?$i.gz ?$i &> /dev/null

done

#剪切打包的日志文件到目標(biāo)目錄

mv /var/log/*.gz $DES_DIR

ls -lh $DES_DIR

echo "The scripts exec end, Files tar successfully !"

21.4.2 ?實(shí)戰(zhàn)-找出192.168.1.1-10網(wǎng)段中,服務(wù)器已經(jīng)關(guān)機(jī)的IP地址

[root@xuegod63 ~]# vim ping.sh

#!/bin/bash

i=1

for (( i=1;i<=10;i++ ))

#?for I in {1..10}

# for I in `seq 10`

do

??ping ?-c ?3 ?192.168.100.$i &> /dev/null

??if ?[ $? -ne 0 ];then

?????echo 192.168.100.$i is shutdown

??fi

done

21.4.3 ?批量創(chuàng)建帳號(hào)并生成隨機(jī)密碼

[root@xuegod63 ~]# vim adduser.sh

#!/bin/bash

for i in xuegod{1..10}

do

??????useradd $i

??????if [ $? -eq 0 ];then

????????echo "create ${i} user is successfully!"

??????else

????????echo "create ${i} user is failed!"

??????fi

??????pass=`date +%s|md5sum|cut -c 1-8`

??????sleep 1

??????echo "$i:$pass" >> /tmp/passwd.log

??????echo $pass |passwd --stdin $i &> /dev/null

??????if [ $? -eq 0 ];then

????????echo " ${i} user change passwd is successfully!"

??????else

????????echo " ${i} user change passwd is failed!"

??????fi

done

注意:%s 總秒數(shù)窑滞。起算時(shí)間為1970-01-01 00:00:00 UTC

更多學(xué)習(xí)資料請(qǐng)移步至公眾號(hào)【學(xué)神來啦】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哀卫,更是在濱河造成了極大的恐慌巨坊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件此改,死亡現(xiàn)場(chǎng)離奇詭異趾撵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)共啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門占调,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人移剪,你說我怎么就攤上這事究珊。” “怎么了纵苛?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵剿涮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我攻人,道長(zhǎng)取试,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任怀吻,我火速辦了婚禮瞬浓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蓬坡。我一直安慰自己猿棉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布渣窜。 她就那樣靜靜地躺著铺根,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乔宿。 梳的紋絲不亂的頭發(fā)上位迂,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音详瑞,去河邊找鬼掂林。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坝橡,可吹牛的內(nèi)容都是我干的泻帮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼计寇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锣杂!你這毒婦竟也來了脂倦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤元莫,失蹤者是張志新(化名)和其女友劉穎赖阻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踱蠢,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡火欧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茎截。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苇侵。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖企锌,靈堂內(nèi)的尸體忽然破棺而出榆浓,到底是詐尸還是另有隱情,我是刑警寧澤霎俩,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布哀军,位于F島的核電站,受9級(jí)特大地震影響打却,放射性物質(zhì)發(fā)生泄漏杉适。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一柳击、第九天 我趴在偏房一處隱蔽的房頂上張望猿推。 院中可真熱鬧,春花似錦捌肴、人聲如沸蹬叭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秽五。三九已至,卻和暖如春饥悴,著一層夾襖步出監(jiān)牢的瞬間坦喘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工西设, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓣铣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓贷揽,卻偏偏與公主長(zhǎng)得像棠笑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子禽绪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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