Linux系統(tǒng)管理與服務H217_第1頁
Linux系統(tǒng)管理與服務H217_第2頁
Linux系統(tǒng)管理與服務H217_第3頁
Linux系統(tǒng)管理與服務H217_第4頁
Linux系統(tǒng)管理與服務H217_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、1第十七章 Shell腳本編程 理論部分理論部分2 iptables默認包括哪些表、鏈?默認包括哪些表、鏈? 對于入站數(shù)據(jù)訪問,會經(jīng)過哪些表、鏈進行處理?對于入站數(shù)據(jù)訪問,會經(jīng)過哪些表、鏈進行處理?課程回顧3 掌握掌握Shell腳本的基礎(chǔ)知識腳本的基礎(chǔ)知識 學會使用學會使用Shell變量變量 學會編寫簡單的學會編寫簡單的Shell腳本腳本 學會常見的條件測試操作學會常見的條件測試操作 學會使用學會使用if條件語句條件語句 學會使用學會使用for、while循環(huán)語句循環(huán)語句 學會使用學會使用case分支語句分支語句技能展示4 用戶的登錄用戶的登錄Shellu 登錄后默認使用的Shell程序,一般

2、為 /bin/bashu 不同Shell的內(nèi)部指令、運行環(huán)境等會有所區(qū)別Shell的作用2-2rootlocalhost # cat /etc/shells/bin/sh/bin/bash/sbin/nologin/bin/tcsh/bin/csh/bin/ksh5 編寫腳本代碼編寫腳本代碼u 使用vi文本編輯器u 每行一條Linux命令,按執(zhí)行順序依次編寫編寫第一個Shell腳本4-1rootlocalhost # vi first.shcd /boot/pwdls -lh vml*6 賦予可執(zhí)行權(quán)限賦予可執(zhí)行權(quán)限u 使腳本具有可執(zhí)行屬性編寫第一個Shell腳本4-2rootlocalhos

3、t # chmod +x first.shrootlocalhost # ls -l first.sh-rwxr-xr-x 1 root root 144 04-26 15:02 first.sh7 執(zhí)行腳本文件執(zhí)行腳本文件u 方法一:腳本文件路徑u 方法二:sh 腳本文件路徑u 方法三:source 腳本文件路徑編寫第一個Shell腳本4-3rootlocalhost # ./first.sh/boot-rw-r-r- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5必須有必須有 x x 權(quán)限權(quán)限r(nóng)ootlocalhost # sh /fi

4、rst.sh/boot-rw-r-r- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5rootlocalhost # source /first.sh/boot-rw-r-r- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5不要求不要求 x x 權(quán)限權(quán)限8 更完善的腳本構(gòu)成更完善的腳本構(gòu)成u 腳本聲明u 注釋信息u 可執(zhí)行語句編寫第一個Shell腳本4-4rootlocalhost # vi /first.sh#!/bin/bash# This is my first Shell-Scr

5、ipt.cd /bootecho 當前的目錄位于:pwdecho 其中以vml開頭的文件包括:ls -lh vml*輸出友好提示信息輸出友好提示信息9 交互式硬件設(shè)備交互式硬件設(shè)備u 標準輸入:從該設(shè)備接收用戶輸入的數(shù)據(jù)u 標準輸出:通過該設(shè)備向用戶輸出數(shù)據(jù)u 標準錯誤:通過該設(shè)備報告執(zhí)行出錯信息重定向與管道操作3-1類型類型設(shè)備文件設(shè)備文件文件描述編號文件描述編號默認設(shè)備默認設(shè)備標準輸入標準輸入/dev/stdin/dev/stdin0 0鍵盤鍵盤標準輸出標準輸出/dev/stdout/dev/stdout1 1顯示器顯示器標準錯誤輸出標準錯誤輸出/dev/stderr/dev/stderr

6、2 2顯示器顯示器10 重定向操作重定向操作重定向與管道操作3-2類型類型操作符操作符用途用途重定向輸入重定向輸入 將輸出結(jié)果保存到指定的文件(覆蓋原有內(nèi)容)將輸出結(jié)果保存到指定的文件(覆蓋原有內(nèi)容)將輸出結(jié)果追加到指定的文件將輸出結(jié)果追加到指定的文件 標準錯誤輸出標準錯誤輸出22將錯誤信息保存到指定的文件(覆蓋原有內(nèi)容)將錯誤信息保存到指定的文件(覆蓋原有內(nèi)容)22將錯誤信息追加到指定的文件中將錯誤信息追加到指定的文件中混合輸出混合輸出&將標準輸出、標準錯誤的內(nèi)容保存到同一個文件中將標準輸出、標準錯誤的內(nèi)容保存到同一個文件中11 管道操作符號管道操作符號“|”u 將左側(cè)的命令輸出結(jié)果,作為右

7、側(cè)命令的處理對象u 格式:cmd1 | cmd2 . | cmdn重定向與管道操作3-3rootlocalhost # grep bash$ /etc/passwdroot:x:0:0:root:/root:/bin/bashteacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bashrootlocalhost # grep “bash$” /etc/passwd | awk -F: print $1,$7 root /bin/bashteacher /bin/bash以冒號以冒號: :分隔,輸出第分隔,輸出第1 1、7 7個字段個

8、字段12 請思考:請思考:u 如何編寫并執(zhí)行一個Shell腳本文件?u 有哪幾種重定向操作,各自的操作符號是什么?u 管道操作符號“|”的用途是什么?小結(jié)13 變量的作用變量的作用u 為靈活管理Linux系統(tǒng)提供特定參數(shù),有兩層意思:n 變量名:使用固定的名稱,由系統(tǒng)預設(shè)或用戶定義n 變量值:能夠根據(jù)用戶設(shè)置、系統(tǒng)環(huán)境的變化而變化 變量的類型變量的類型u 自定義變量:由用戶自己定義、修改和使用u 環(huán)境變量:由系統(tǒng)維護,用于設(shè)置工作環(huán)境u 位置變量:通過命令行給腳本程序傳遞參數(shù)u 預定義變量:Bash中內(nèi)置的一類變量,不能直接修改Shell變量的作用、類型14 定義一個新的變量定義一個新的變量u

9、 格式:變量名=變量值u 變量名以字母或下劃線開頭,區(qū)分大小寫,建議全大寫 查看變量的值查看變量的值u 格式:echo $變量名自定義變量4-1rootlocalhost # Product=Benetrootlocalhost # Version=4.0rootlocalhost # echo $ProductBenetrootlocalhost # echo $Product $VersionBenet 4.015 賦值時使用引號賦值時使用引號u 雙引號:允許通過$符號引用其他變量值u 單引號:禁止引用其他變量值,$視為普通字符u 反撇號:命令替換,提取命令執(zhí)行后的輸出結(jié)果 從鍵盤輸入內(nèi)容

10、為變量賦值從鍵盤輸入內(nèi)容為變量賦值u 格式: read -p 提示信息 變量名自定義變量4-216 設(shè)置變量的作用范圍設(shè)置變量的作用范圍u 格式1:export 變量名 .u 格式2: export 變量名=變量值 .u 兩種格式可以混合使用自定義變量4-3rootlocalhost # echo $Product $VersionBenet 4.0rootlocalhost # export Product Versionrootlocalhost # bashrootlocalhost # echo $Product $VersionBenet 4.0rootlocalhost # exi

11、t導出為全局變量導出為全局變量子程序引用全局變量子程序引用全局變量17 整數(shù)變量的運算整數(shù)變量的運算u 格式:expr 變量1 運算符 變量2 運算符 變量3 . 常用運算符常用運算符u 加法運算:+u 減法運算: -u 乘法運算: *u 除法運算: /u 求模(取余)運算: % 自定義變量4-418 環(huán)境變量環(huán)境變量u 由系統(tǒng)提前創(chuàng)建,用來設(shè)置用戶的工作環(huán)境u 配置文件: /etc/profile、/.bash_profile 常見的環(huán)境變量:常見的環(huán)境變量:u PWD、PATHu USER 、LOGNAME、UID、SHELL、HOMEu PS1、$PS2特殊的Shell變量3-1root

12、localhost # echo $PATH/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/binrootlocalhost # PATH=$PATH:/root rootlocalhost # echo $PATH/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/roo

13、t19 位置變量位置變量u 表示為 $n,n為19之間的數(shù)字rootlocalhost # ./myprog.sh one two three four five six特殊的Shell變量3-2$1$1,第,第1 1個位置參數(shù)個位置參數(shù)$2$2,第,第2 2個位置參數(shù)個位置參數(shù)$6$6,第,第6 6個位置參數(shù)個位置參數(shù)20 預定義變量預定義變量u $#:命令行中位置變量的個數(shù)u $*:所有位置變量的內(nèi)容u $?:上一條命令執(zhí)行后返回的狀態(tài),當返回狀態(tài)值為0時表示執(zhí)行正常,非0值表示執(zhí)行異?;虺鲥eu $0:當前執(zhí)行的進程/程序名特殊的Shell變量3-3rootlocalhost # cat

14、mybak.sh#!/bin/bashTARFILE=beifen-date +%s.tgztar zcf $TARFILE $* & /dev/nullecho 已執(zhí)行 $0 腳本,echo 共完成 $# 個對象的備份echo “具體內(nèi)容包括: $*” rootlocalhost # ./mybak.sh /etc/passwd /etc/shadow 已執(zhí)行 ./mybak.sh 腳本,共完成 2 個對象的備份具體包括:/etc/passwd /etc/shadow21 腳本應用思路腳本應用思路u 1. 確定命令操作(設(shè)計并執(zhí)行任務)u 2. 編寫Shell腳本(組織任務過程)u 3. 設(shè)

15、置計劃任務(控制時間,調(diào)用任務腳本)Shell腳本與計劃任務rootlocalhost # mysqldump -u operator rootlocalhost # vi /opt/qnzx_dbbak/qnzx_dbbak.sh#!/bin/bashrootlocalhost # crontab -e30 2 * * * /opt/qnzx_dbbak/qnzx_dbbak.sh22 test命令命令u 測試特定的表達式是否成立,當條件成立時,測試語句的返回值為0,否則為其他數(shù)值u 格式1:test 條件表達式u 格式2: 條件表達式 條件測試操作5-1至少應有一個空格至少應有一個空格23

16、 文件測試文件測試u 格式: 操作符 文件或目錄 常用的測試操作符常用的測試操作符u -d:測試是否為目錄(Directory)u -e:測試目錄或文件是否存在(Exist)u -f:測試是否為文件(File)u -r:測試當前用戶是否有權(quán)限讀?。≧ead)u -w:測試當前用戶是否有權(quán)限寫入(Write)u -x:測試當前用戶是否有權(quán)限執(zhí)行(eXcute)條件測試操作5-2rootlocalhost # -d /etc/vsftpd rootlocalhost # echo $?0rootlocalhost # -d /etc/hosts rootlocalhost # echo $?1ro

17、otlocalhost # -e /media/cdrom & echo YESYES 返回返回0 0表示條件成立表示條件成立返回返回1 1表示條件不成立表示條件不成立邏輯與,邏輯與,“而且而且”的意思的意思24 整數(shù)值比較整數(shù)值比較u 格式: 整數(shù)1 操作符 整數(shù)2 常用的測試操作符常用的測試操作符u -eq:等于(Equal)u -ne:不等于(Not Equal)u -gt:大于(Greater Than)u -lt:小于(Lesser Than)u -le:小于或等于(Lesser or Equal)u -ge:大于或等于(Greater or Equal)條件測試操作5-3rootl

18、ocalhost # who | wc -l7rootlocalhost # $(who | wc -l) -gt 5 & echo Too many. Too many.rootlocalhost # $(who | wc -l) -ge 10 & echo = 10.用戶數(shù)是否用戶數(shù)是否 5 5用戶數(shù)是否用戶數(shù)是否 = 10= 10rootlocalhost # FreeCC=$(free -m | grep cache: | awk print $4)rootlocalhost # $FreeCC -lt 1024 & echo $FreeCCMB864MB空閑內(nèi)存是否空閑內(nèi)存是否 10

19、24MB80% then 報警fiif 條件測試操作命令序列 fi 結(jié)束判斷條件成立 then條件不成立29 雙分支結(jié)構(gòu)雙分支結(jié)構(gòu)if語句的結(jié)構(gòu)3-2if 條件測試操作 then 命令序列1 else 命令序列2fiif 80端口是否在監(jiān)聽 then 網(wǎng)站服務已在運行 else 啟動httpd服務fiif 條件測試操作命令序列1 條件成立 then命令序列2 條件不成立 elsefi 結(jié)束判斷30 多分支結(jié)構(gòu)多分支結(jié)構(gòu)if語句的結(jié)構(gòu)3-3if 條件測試操作1 then 命令序列1elif 條件測試操作2 then 命令序列2else 命令序列3fiif 分數(shù)為85100之間 then 判為優(yōu)秀

20、elif 分數(shù)為7084之間 then 判為合格esle 判為不合格fiif 條件測試操作1命令序列1 條件成立 then命令序列n 條件不成立 elseelif 條件測試操作2命令序列2 條件成立 thenfi 結(jié)束判斷31 單分支單分支if語句語句u 判斷掛載點目錄,若不存在則自動創(chuàng)建if語句應用示例3-1rootlocalhost # cat chkmountdir.sh#!/bin/bashMOUNT_DIR=/media/cdrom/if ! -d $MOUNT_DIR then mkdir -p $MOUNT_DIRfi當目錄不存在時執(zhí)行當目錄不存在時執(zhí)行rootlocalhost

21、 # ls -ld /media/cdrom/ls: /media/cdrom/: 沒有那個文件或目錄rootlocalhost # ./chkmountdir.shrootlocalhost # ls -ld /media/cdrom/drwxr-xr-x 2 root root 4096 05-05 07:18 /media/cdrom/32 雙分支雙分支if語句語句u 判斷目標主機是否存活,顯示檢測結(jié)果if語句應用示例3-2rootlocalhost # cat pinghost.sh#!/bin/bashping -c 3 -i 0.2 -W 3 $1 & /dev/nullif $?

22、 -eq 0 then echo Host $1 is up.else echo Host $1 is down.fi判斷判斷pingping命令的檢測結(jié)果,命令的檢測結(jié)果,分別給出不同提示分別給出不同提示rootlocalhost # ./pinghost.sh 1Host 1 is up.rootlocalhost # ./pinghost.sh 3Host 3 is down.33 多分支多分支if語句語句u 判斷分數(shù)范圍,分出優(yōu)秀、合格、不合格三檔if語句應用示例3-3rootlocalhost #

23、 cat gradediv.sh#!/bin/bashread -p 請輸入您的分數(shù)(0-100): GRADEif $GRADE -ge 85 & $GRADE -le 100 ; then echo $GRADE 分!優(yōu)秀elif $GRADE -ge 70 & $GRADE -le 84 ; then echo $GRADE 分,合格else echo $GRADE 分?不合格”fi判斷分數(shù)所在區(qū)間,給出不判斷分數(shù)所在區(qū)間,給出不同的分檔結(jié)果同的分檔結(jié)果rootlocalhost # ./gradediv.sh請輸入您的分數(shù)(0-100):8989 分!優(yōu)秀34 讀取不同的變量值,用來逐

24、個執(zhí)行同一組命令讀取不同的變量值,用來逐個執(zhí)行同一組命令for語句的結(jié)構(gòu)for 變量名 in 取值列表do 命令序列donefor 收件人 in 郵件地址列表do 發(fā)送郵件donefor 變量=取值1取值1取值2取值ndone 結(jié)束循環(huán)do 命令序列取值n 已使用35 批量添加用戶批量添加用戶u 用戶名存放在users.txt文件中,每行一個u 初始密碼均設(shè)為123456for語句應用示例2-1rootlocalhost # cat /root/users.txtchenyedengchaozhangjierootlocalhost # cat uaddfor.sh#!/bin/bashULI

25、ST=$(cat /root/users.txt)for UNAME in $ULISTdo useradd $UNAME echo 123456 | passwd -stdin $UNAMEdone通過管道指定密碼字串通過管道指定密碼字串從列表文件讀取用戶名從列表文件讀取用戶名rootlocalhost # ./uaddfor.shrootlocalhost # tail -3 /etc/passwdchenye:x:1011:1011:/home/chenye:/bin/bashdengchao:x:1012:1012:/home/dengchao:/bin/bashzhangjie:x:

26、1013:1013:/home/zhangjie:/bin/bash36 根據(jù)根據(jù)IP地址檢查主機狀態(tài)地址檢查主機狀態(tài)u IP地址存放在ipadds.txt文件中,每行一個u 使用ping命令檢測各主機的連通性for語句應用示例2-2rootlocalhost # cat /root/ipadds.txt11020rootlocalhost # cat chkhosts.sh#!/bin/bashHLIST=$(cat /root/ipadds.txt)for IP in $HLISTdo ping -c 3 -i 0.2 -W

27、 3 $1 & /dev/null if $? -eq 0 ; then echo Host $IP is up. else echo Host $IP is down. fidone嵌套嵌套ifif語句判斷連通性語句判斷連通性從列表文件讀取從列表文件讀取IPIP地址地址rootlocalhost # ./chkhosts.shHost 1 is up.Host 10 is down.Host 20 is up.37 重復測試某個條件,只要條件成立則反復執(zhí)行重復測試某個條件,只要條件成立則反復執(zhí)行while語句的結(jié)構(gòu)while

28、條件測試操作do 命令序列donewhile 未猜中正確價格do 反復猜測商品價格donewhile 條件測試操作done 結(jié)束循環(huán)do 命令序列 條件成立條件不成立38 批量添加用戶批量添加用戶u 用戶名稱以stu開頭,按數(shù)字順序進行編號u 一共添加20個用戶,即stu1、stu2、stu20u 初始密碼均設(shè)為123456While語句應用示例2-1rootlocalhost # cat uaddwhile.sh#!/bin/bashPREFIX=stui=1while $i -le 20 do useradd $PREFIX$i echo 123456 | passwd -stdin $P

29、REFIX$i & /dev/null let i+done序號遞增,避免死循環(huán)序號遞增,避免死循環(huán)循環(huán)條件:序號循環(huán)條件:序號=20=20rootlocalhost # ./uaddwhile.shrootlocalhost # grep stu /etc/passwd | tail -3stu18:x:1028:1028:/home/stu18:/bin/bashstu19:x:1029:1029:/home/stu19:/bin/bashstu20:x:1030:1030:/home/stu20:/bin/bash39 猜商品價格游戲猜商品價格游戲u 通過變量RANDOM獲得隨機數(shù)u 提

30、示用戶猜測并記錄次數(shù),猜中后退出循環(huán)While語句應用示例2-2rootlocalhost # vi pricegame.sh#!/bin/bashPRICE=$(expr $RANDOM % 1000)TIMES=0echo 商品實際價格為0-999之間,猜猜看是多少?while truedo read -p 請輸入你猜測的價格數(shù)目: INT let TIMES+ if $INT -eq $PRICE ; then echo 恭喜你答對了,實際價格是 $PRICE echo 你總共猜測了 $TIMES 次 exit 0 elif $INT -gt $PRICE ; then echo 太高了

31、! else echo 太低了! fidone與實際價格比較,給出提示與實際價格比較,給出提示循環(huán)條件:循環(huán)條件:tureture若猜中則退出腳本若猜中則退出腳本提示猜測并記錄次數(shù)提示猜測并記錄次數(shù)rootlocalhost # ./pricegame.sh商品實際價格為0-999之間,猜猜看是多少?請輸入你猜測的價格數(shù)目:500太高了!請輸入你猜測的價格數(shù)目:250太低了!請輸入你猜測的價格數(shù)目:375太高了!請輸入你猜測的價格數(shù)目:280太高了!請輸入你猜測的價格數(shù)目:265太高了!請輸入你猜測的價格數(shù)目:253恭喜你答對了,實際價格是 253你總共猜測了 6 次40 請思考:請思考:u

32、for、while都能批量添加用戶,兩者有哪些區(qū)別?u for循環(huán)使用的取值列表如何獲得?u 如何避免while語句陷入死循環(huán)?小結(jié)41 針對變量的不同取值,分別執(zhí)行不同的命令序列針對變量的不同取值,分別執(zhí)行不同的命令序列 case語句的結(jié)構(gòu)case 變量值 in模式1) 命令序列1 ;模式2) 命令序列2 ;* ) 默認命令序列esaccase 控制指令 instart) 啟動XX服務 ;stop) 停止XX服務 ;* ) 顯示服務腳本的用法esaccase 變量=模式1esac 結(jié)束分支命令序列1;有變量=模式2變量=其他值(*)默認命令序列無是否否命令序列2;有無是42 擊鍵類型識別擊鍵

33、類型識別u 提示用戶輸入一個字符u 判斷出該字符是字母、數(shù)字或者其他字符case語句應用示例2-1rootlocalhost # cat hitkey.sh#!/bin/bashread -p 請輸入一個字符,并按Enter鍵確認: KEYcase $KEY in a-z|A-Z) echo 您輸入的是 字母。 ; 0-9) echo 您輸入的是 數(shù)字。 ; *) echo 您輸入的是 空格、功能鍵或其他控制字符。esac匹配小寫或大寫字母匹配小寫或大寫字母匹配數(shù)字匹配數(shù)字0-90-9rootlocalhost # ./hitkey.sh請輸入一個字符,并按Enter鍵確認:k您輸入的是 字母 k 。rootlocalhost # ./hitkey.sh請輸入一個字符,并按Enter鍵確認:8您輸入的是 數(shù)字 8 。rootlocalhost # ./hitkey.sh請輸入一個字符,并按Enter鍵確認:19您輸入的是 空格、功能鍵或其他控制字符。按功能鍵按功能鍵F8F843 編寫系統(tǒng)服務腳本編寫系統(tǒng)服務腳本u 使用start、stop、restart等參數(shù)來控制服務u 服務控制指令通過位置變量$1傳入u 能夠通過chkconfig命令來管理此服務case語句應用示例2-2rootlocalhost

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論