linux運維零基礎學習資料:結構化命令case和for、while循環

想要獲取更多學習資料,關注公眾號學神來啦

本節所講內容:

21.1 ?case-流程控制語句

21.2 ?循環語句

21.3 ?while循環語句和循環嵌套

21.4 ?實戰-3個shell腳本實戰

21.1 ?流程控制語句:case

控制語句:用來實現對程序流程的選擇、循環、轉向和返回等進行控制。case是開關語句的一個組成部分;

它是根據變量的不同進行取值比較,然后針對不同的取值分別執行不同的命令操作

適用于多分支,是一個多選擇語句

case?????變量或表達式?????in

?????? ???????變量或表達式1)

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

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

????????????變量或表達式2)

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

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

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

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

?????????????????????默認命令序列

?esac

case語句執行流程控制:

執行流程:

首先使用“變量或表達式”的值與值1進行比較,若取值相同則執行值1后的命令序列,直到遇見雙分號“;; ”后跳轉至esac,表示分支結束;

若與值1不相匹配,則繼續與值2 進行比較,若取值相同則執行值2 后的命令序列,直到遇見雙分號“;; ”后跳轉至esac,表示結束分支。

依次類推,若找不到任何匹配的值,則執行默認模式“ *) ”后的命令序列,直到遇見esac后結束分支

注意事項:

“變量或表達式”后面必須為單詞in,每一個“變量或表達式”的值必須以右括號結束。取值可以為變量或常數。匹配發現取值符合某一模式后,其間所有命令開始執行直至 ;;

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

例1:編寫一個操作文件的腳本

[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 "請輸入您的選擇: " OP

case $OP in

1|backup)

echo "BACKUP......"

;;

2|copy)

echo "COPY....."

;;

3|quit)

exit

;;

*)

echo error

esac

sh ?case1.sh

例2:編寫一個啟動apache服務腳本

[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 ?循環語句

21.2.1 ?for-do-done

語法格式:

for var in list ???#for后跟var(var相當于一個變量)list(相當于一個列表)

do

??commands

done

或:

for var in list ; do

??commands

done

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

可以直接讀取in 后面的值,默認以空格做分隔

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

#!/bin/bash

for var in a1 b1 c1 d1

do

echo the text is $var

done

列表中的復雜值,可以使用引號或轉義字符”\”來加以約束

[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 ??#默認以以空格做分隔符

#!/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分隔符

默認情況下,base shell會以空格、制表符、換行符做為分隔符。通過IFS來自定義為分隔符

指定單個字符做分隔符:

IFS=: ??#以:冒號做分隔符

可以指定多個

如 IFS='\n: "; ' ???#這個賦值會將反斜杠、n、冒號、雙引號、分號作為字段分隔符。

注:$'\n'與'\n'時的區別

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???#以:冒號做分隔符

#!/bin/bash

IFS=:

for i in `cat /etc/hosts`

do

echo $i

done

6、C語言風格的for

語法格式:

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

do

???commmands

done

例1:單個變量 輸出1到10之間的數字

[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 只賦值一次。然后執行 i <= 10

do

echo num is $i

i=$(($i+1))????# i++在這里執行。 當for循環體中所有命令執行完后,再執行i++

done

例2:多個變量。 同時輸出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循環語句和循環嵌套

21.3.1 ?while-do-done

重復測試指令的條件,只要條件成立就反復執行對應的命令操作,直到命令不成立或為假;

語法格式如下:

while?測試命令

do

命令

done

注意:避免陷入死循環 ?while true

例1:降序輸出10到1的數字

[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:輸出如下圖兩數相乘的效果

自增操作 ?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 ?嵌套循環

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

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

cp

cd

ls

find

ln

編寫腳本的思路

1 ?明確腳本的功能

2 ?編寫腳本時會使用到那些命令 ? ?useradd ???passwd ??for

3 ?把變化的數據使用變量表示

4 ?選擇適合的流程控制 ?(選擇 、 循環 、分支)

[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

注:&> 是正確和錯誤的信息都重定向到/dev/null里面,相當于1> /dev/null 2>&1 這個寫法

例2 :打印九九乘法表

注:外層循環循環行,內層循環循環列

規律: ?內層循環的變量<=外層循環的變量

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 ?實戰-3個shell腳本實戰

21.4.1 ?實戰-將/opt目錄下所有的日志文件全自動打包

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

#!/bin/bash

SRC_DIR=/var/log/

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

#如果目標目錄不存在,則創建目標目錄

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

#剪切打包的日志文件到目標目錄

mv /var/log/*.gz $DES_DIR

ls -lh $DES_DIR

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

21.4.2 ?實戰-找出192.168.1.1-10網段中,服務器已經關機的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 ?批量創建帳號并生成隨機密碼

[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 總秒數。起算時間為1970-01-01 00:00:00 UTC

更多學習資料請移步至公眾號【學神來啦】

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容