




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目9編寫Shell腳本任務(wù)1簡(jiǎn)單的shellscript編寫任務(wù)2shellscripts進(jìn)階項(xiàng)目導(dǎo)入如果想要管理好屬于自己的主機(jī),以及后續(xù)工作中想要一路高歌,學(xué)習(xí)shell腳本(Shellscript)是必不可少的。Shellscript類似于早期的批處理工具,即將一些命令匯總起來一次性執(zhí)行。但是shellscript功能更強(qiáng)大,,那就是它可以進(jìn)行類似程序(program)的撰寫,并且不需要進(jìn)過編譯(compile)即可運(yùn)行,非常方便。同時(shí)我們還可以通過shellscript來簡(jiǎn)化我們?nèi)粘5倪\(yùn)維管理工作。在整個(gè)Linux的環(huán)境中,一些服務(wù)(service)的啟動(dòng)都是通過shellscript來運(yùn)行的,一旦出現(xiàn)問題,是一件非常頭疼的事情。職業(yè)能力目標(biāo)和要求1.理解shellscript2.熟練掌握判斷式語(yǔ)法的運(yùn)用3.熟練掌握條件判斷式語(yǔ)法的運(yùn)用4.熟練掌握循環(huán)語(yǔ)法的運(yùn)用5.了解中國(guó)計(jì)算機(jī)發(fā)展歷程,堅(jiān)定二十大中的深入實(shí)施人才強(qiáng)國(guó)戰(zhàn)略項(xiàng)目9編寫Shell腳本簡(jiǎn)單的shellscript編寫任務(wù)1任務(wù)介紹任務(wù)1隨著河北唐訊信息技術(shù)股份有限公司的日益發(fā)展,項(xiàng)目部門最新入職了10人,為新入職員工注冊(cè)賬號(hào),人事部門已經(jīng)提供了一份人員名單””,作為網(wǎng)絡(luò)管理員,已經(jīng)把這份名單copy到了/tangxun/user/,要求密碼10位,并且盡量復(fù)雜,初始密碼不可重復(fù)。基于以上要求,網(wǎng)絡(luò)管理員小李決定使用shellscript進(jìn)行創(chuàng)建。人員名單如表9-1任務(wù)介紹任務(wù)1任務(wù)分析任務(wù)1要實(shí)現(xiàn)利用shellscript進(jìn)行人員賬號(hào)創(chuàng)建,可以分為以下幾個(gè)步驟步驟一:確定人員名單步驟二:了解隨機(jī)數(shù)值的參數(shù)步驟三:shellscript基本參數(shù)步驟四:完成shellscript的編寫任務(wù)準(zhǔn)備:9.1.1shellscript概述任務(wù)1shellscript就像是早期DOS年代的批處理(.bat),最簡(jiǎn)單的功能就是將許多命令寫在一起,讓使用者很輕易地就能夠處理復(fù)雜的操作(運(yùn)行一個(gè)文件“shellscript”,就能夠一次運(yùn)行多個(gè)命令)。shellscript能提供數(shù)組、循環(huán)、條件與邏輯判斷等重要功能,讓用戶也可以直接以shell來撰寫程序,而不必使用類似C程序語(yǔ)言等傳統(tǒng)程序撰寫的語(yǔ)法。shellscript可以被簡(jiǎn)單地看成是批處理文件,也可以被說成是一個(gè)程序語(yǔ)言,并且這個(gè)程序語(yǔ)言都是利用shell與相關(guān)工具命令組成的,所以不需要編譯即可運(yùn)行。另外,shellscript還具有不錯(cuò)的排錯(cuò)(debug)工具,所以,它可以幫助系統(tǒng)管理員快速地管理好主機(jī)。任務(wù)準(zhǔn)備:9.1.2編寫并執(zhí)行shellscript程序任務(wù)11.編寫shellscript的注意事項(xiàng)①命令的實(shí)行是從上至下,從左至右進(jìn)行的;②命令、選項(xiàng)與參數(shù)之間的多個(gè)空格會(huì)被忽略③空白行將被忽略,”Tab”縮進(jìn)也會(huì)被視為空格④如果讀取到一個(gè)Enter符號(hào)(CR),就嘗試開始運(yùn)行該行(或該串)命令。⑤如果一行的內(nèi)容太多,則可以使用“\[Enter]”來延伸至下一行。⑥“#”可以作為注解,任何加在#后面的數(shù)據(jù)將全部被視為注解文字而被忽略。⑦shellscript文件的第一行是個(gè)例外,”#”后面的驚嘆號(hào)會(huì)告訴shell用哪個(gè)shell來運(yùn)行腳本,而不是將后面的文字忽略。任務(wù)準(zhǔn)備:9.1.2編寫并執(zhí)行shellscript程序任務(wù)12.運(yùn)行shellscript程序現(xiàn)在假設(shè)程序文件名是/root/sh/shell.sh,但是我們應(yīng)該如何去運(yùn)行這個(gè)程序文件呢?(1)直接命令下達(dá):shell.sh文件必須要具備可讀與可運(yùn)行(rx)的權(quán)限。絕對(duì)路徑:使用/root/sh/shell.sh來下達(dá)命令。相對(duì)路徑:假設(shè)工作目錄在/root/sh/目錄下,則使用./shell.sh來運(yùn)行。變量“PATH”功能:將shell.sh放在PATH指定的目錄內(nèi),如~/bin/。(2)以bash程序來運(yùn)行:通過“bashshell.sh”或“shshell.sh”來運(yùn)行。由于linux默認(rèn)使用者家目錄下的~/bin目錄會(huì)被設(shè)置到$PATH內(nèi),所以也可以將shell.sh創(chuàng)建在/root/sh/bin/下面(~/bin目錄需要自行設(shè)置)。此時(shí),若shell.sh在~/bin內(nèi)且具有rx的權(quán)限,直接輸入shell.sh即可運(yùn)行該腳本程序。任務(wù)準(zhǔn)備:9.1.2編寫并執(zhí)行shellscript程序任務(wù)13.編寫一個(gè)shellscript程序【實(shí)例9-1】簡(jiǎn)單script:hicentos任務(wù)準(zhǔn)備:9.1.2編寫并執(zhí)行shellscript程序任務(wù)1知識(shí)鏈接:在使用”echo$?”查看運(yùn)行的結(jié)果時(shí),返回值為0表示運(yùn)行成功,返回值非零即表示運(yùn)行錯(cuò)誤。精益求精:查看編寫的shellscript是否可以執(zhí)行成功,以及返回值為錯(cuò)誤的情況。任務(wù)準(zhǔn)備:9.1.3養(yǎng)成良好的編寫習(xí)慣任務(wù)1養(yǎng)成良好的script編寫習(xí)慣,即在每個(gè)script的文件頭處包含以下信息:①script的功能②版本信息③作者與聯(lián)系方式④版權(quán)聲明方式⑤歷史記錄⑥script內(nèi)比較特殊的命令,使用絕對(duì)路徑來執(zhí)行該命令⑦運(yùn)行時(shí)需要的環(huán)境變量預(yù)先進(jìn)行聲明并進(jìn)行設(shè)置任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)11.交互式腳本:變量?jī)?nèi)容由使用者決定很多時(shí)候,需要使用者輸入一些內(nèi)容,以便腳本來順利運(yùn)行【實(shí)例9-2】使用read命令編寫一個(gè)腳本。顯示,“Pleaseinputanumber:”進(jìn)行提示讓用戶輸入數(shù)值,然后在屏幕顯示”Thenumberyouenteredis:”任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)1知識(shí)鏈接:交互式腳本的實(shí)現(xiàn)是依靠”read-p”參數(shù)精益求精:實(shí)現(xiàn)執(zhí)行腳本時(shí)呈現(xiàn)交互”請(qǐng)輸入網(wǎng)卡名稱”,并完成網(wǎng)卡信息的查看任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)12.數(shù)值運(yùn)算:簡(jiǎn)單的加減乘除可以使用declare來定義變量的類型,利用”$((計(jì)算式))”來進(jìn)行數(shù)值運(yùn)算。但是比較可惜的是,bashshell默認(rèn)僅支持到整數(shù)?!緦?shí)例9-3】要求用戶輸入兩個(gè)變量,然后將兩個(gè)變量的內(nèi)容進(jìn)行相乘,最后輸出相乘的結(jié)果。任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)1知識(shí)鏈接:在數(shù)值的運(yùn)算上,可以使用“declare-itotal=$firstnu*$secnu”,也可以使用上面的方式來表示。建議使用下面的方式進(jìn)行運(yùn)算:var=$((運(yùn)算內(nèi)容))至于數(shù)值運(yùn)算上的處理,則有+、-、*、/、%等,其中%是取余數(shù)。精益求精:使用echo計(jì)算240除以4任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)13.浮點(diǎn)計(jì)算bashshell數(shù)學(xué)運(yùn)算符只支持整數(shù)運(yùn)算。若要進(jìn)行任何實(shí)際的數(shù)學(xué)計(jì)算,這是一個(gè)巨大的限制。有幾種解決方案能夠克服bash中數(shù)學(xué)運(yùn)算的整數(shù)限制。最常見的方案是用內(nèi)建的bash計(jì)算器,叫作bc?!緦?shí)例9-4】可以在shell提示符下通過bc命令訪問bash計(jì)算器:任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)1【實(shí)例9-5】bc除法[root@localhost~]#bc-qscale062.763/512scale=462.763/512.5526說明:scale變量的默認(rèn)值是0。在scale值被設(shè)置前,bash計(jì)算器的計(jì)算結(jié)果不包含小數(shù)位。在將其值設(shè)置成4后,bash計(jì)算器顯示的結(jié)果包含四位小數(shù)。-q命令行選項(xiàng)可以不顯示bash計(jì)算器冗長(zhǎng)的歡迎信息。(2)在腳本中使用bcbash計(jì)算器如何在shell腳本中處理浮點(diǎn)運(yùn)算。我們可以利用命令替換即:variable=$(echo"options;expression"|bc)第一部分options允許你設(shè)置變量。如果你需要不止一個(gè)變量,可以用分號(hào)將其分開,expression參數(shù)定義了通過bc執(zhí)行的數(shù)學(xué)表達(dá)式。任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)1【實(shí)例9-6】腳本中運(yùn)用bc計(jì)算器[root@localhostsripts]#catcalculator.sh#!/bin/bash#thisiscalculatortestshellscriptvar1=$(echo"scale=4;73.44/5"|bc)echo"Theansweris$var1"這個(gè)例子將scale變量設(shè)置成了四位小數(shù),并在expression部分指定了特定的運(yùn)算。運(yùn)行這個(gè)腳本會(huì)產(chǎn)生如下輸出。[root@localhostsripts]#shcalculator.shTheansweris14.6880任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)1知識(shí)鏈接:bc計(jì)算器可以中的數(shù)值可以用變量來代替,腳本中同樣適用。精益求精:讓使用者輸入圓的半徑,利用bc計(jì)算器來計(jì)算圓的面積任務(wù)準(zhǔn)備:9.1.4簡(jiǎn)單的shellscript任務(wù)1【實(shí)例9-7】利用source執(zhí)行腳本[root@localhostsripts]#sourcesript02.sh //source執(zhí)行sript02.shPleaseinputanumber:9876 //9876為自行輸入的Thenumberyouenteredis:9876[root@localhostsripts]#echo$num9876從實(shí)例9-7中可以看到變量生效了,因?yàn)閟ource對(duì)腳本的運(yùn)行方式可以使用下面的圖9-2來說明。sh02.sh會(huì)在父程序中運(yùn)行,因此各項(xiàng)操作都會(huì)在原來的bash內(nèi)生效。這也是為什么當(dāng)你不注銷系統(tǒng)而要讓某些寫入~/.bashrc的設(shè)置生效時(shí),需要使用“source~/.bashrc”而不能使用“bash~/.bashrc”的原因。任務(wù)1任務(wù)實(shí)施1.查看人員名單[root@localhost~]#mkdir-p/tangxun/user/[root@localhost~]#vim/tangxun/user/[root@localhost~]#cat/tangxun/user/ZhangsanLisiWangwuLiuqiXiaowuRendanZhouqiangYangfanHanxuZhuming任務(wù)1任務(wù)實(shí)施2.編輯shellscript。[root@localhostsripts]#catuser.sh#!/bin/bash#Explain:#ThisisascripttocreateauserPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATHUSER=/tangxun/user/forUSERin`cat$USERLIST`;doif!id$USER&>/dev/null;then PASS=`echo$RANDOM|md5sum|cut-c1-10` useradd$USER echo$PASS|passwd--stdin$USER&>/dev/null echo"$USER$PASS">>/tangxun/newcreateuser.list else echo"$USERalreadyexist!" fidone任務(wù)1任務(wù)實(shí)施3.說明USER=/tangxun/user/forUSERin`cat$USERLIST`;doif!id$USER&>/dev/null;then PASS=`echo$RANDOM|md5sum|cut-c1-10` useradd$USER echo$PASS|passwd--stdin$USER&>/dev/null echo"$USER$PASS">>/tangxun/newcreateuser.list elseecho"$USERalreadyexist!" fidone任務(wù)1任務(wù)實(shí)施主程序部分第一段為設(shè)置,存放用戶名單的路徑USER第二段使用for語(yǔ)句在$USER中循環(huán),do做第三段為檢查USER列表中的用戶是否存在,存在的話該用戶創(chuàng)建失敗,不存在的話繼續(xù)執(zhí)行以下語(yǔ)句第四段中的echo$RANDOM為導(dǎo)入系統(tǒng)函數(shù)生成隨機(jī)數(shù),md5sum會(huì)將生成的隨機(jī)數(shù)通過SHA256哈希算法生成一個(gè)密碼,cut-c1-10為截取前10位數(shù)。第五段使用useradd創(chuàng)建用戶第六段echo"$PASS"|passwd--stdin$USER就是讀取$PASS這個(gè)的值給$USER設(shè)置密碼;&>/dev/null不管正確或者錯(cuò)誤信息都輸出到/dev/null這個(gè)/dev/null類似于垃圾箱/回收站。第七段,為將用戶名和密碼存放到/tangxun/newcreateuser.list文件中第八段的else用白話解釋的話就是否則,即如果名單中的某個(gè)用戶已經(jīng)存在第九段為在屏幕顯示XXX用戶已經(jīng)存在第十段fi結(jié)束第十一段done為完成任務(wù)1任務(wù)實(shí)施4.執(zhí)行腳本[root@localhostsripts]#chmod+xuser.sh[root@localhostsripts]#./user.sh[root@localhostsripts]#cd/tangxun/user/[root@localhostuser]#lsnewuser.list[root@localhostuser]#catnewuser.listZhangsan:6ac70689b3Lisi:89244e4e55Wangwu:25458fd71aLiuqi:28812f5027Xiaowu:854882bbd6Rendan:6dad8d0044Zhouqiang:feca4b1d80Yangfan:14b4cbbe82Hanxu:a32282baa3Zhuming:67538c7a9f[root@localhostuser]#cat/etc/passwd.........Zhouqiang:x:1032:1032::/home/Zhouqiang:/bin/bashYangfan:x:1033:1033::/home/Yangfan:/bin/bashHanxu:x:1034:1034::/home/Hanxu:/bin/bashZhuming:x:1035:1035::/home/Zhuming:/bin/bash任務(wù)小結(jié)任務(wù)11.腳本文件的創(chuàng)建即使用編輯器創(chuàng)建一個(gè)以sh為擴(kuò)展名的文件2.在腳本文件的第一行添加以下內(nèi)容,用于指定解釋器#!/bin/bash3.使用#符號(hào)可以添加注釋,注釋內(nèi)容會(huì)被解釋器忽略4.在Shell腳本中,變量使用時(shí)無需聲明類型,直接賦值即可。任務(wù)拓展任務(wù)1河北唐訊信息技術(shù)股份有限公司,近期面試中為檢測(cè)面試人員的shell相關(guān)能力,有一例面試題,使用shellscripts截取http://www.hebeitangxun/home/123.html的字符串,要求分別取出www.hebeitangxun,123.html;http;http://www;hebeitangxun;這些字符串。項(xiàng)目9編寫Shell腳本shellscripts進(jìn)階任務(wù)2任務(wù)介紹任務(wù)2在河北唐訊信息技術(shù)股份有限公司,作為網(wǎng)絡(luò)管理員的小李為提升工作效力,想要編寫一個(gè)相關(guān)于服務(wù)器使用情況的shellscripts,要能執(zhí)行腳本之后可以查看到:服務(wù)器的主網(wǎng)卡IP地址、主機(jī)名、cpu的使用情況、iowait的使用情況、內(nèi)存的使用情況、磁盤的使用情況以及TCP連接狀態(tài)。任務(wù)分析任務(wù)2要實(shí)現(xiàn)公司服務(wù)器的各個(gè)情況的顯示shellscripts,需要以下幾個(gè)步驟:步驟一:熟練掌握網(wǎng)卡IP、主機(jī)名查看的命令步驟二:熟練掌握查看cpu使用情況的命令步驟三:熟練掌握查看iowait使用情況的命令步驟四:熟練掌握查看內(nèi)存的使用情況的命令步驟五:熟練掌握shellscripts的各種語(yǔ)法任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2在前面我們說到過$?這個(gè)變量代表的含義。使用echo$?可以判斷上一條命令執(zhí)行的是否正確,例如如果想要查看一個(gè)文件,我們使用lsxxx文件,如果這個(gè)文件存在,使用echo$?會(huì)顯示0,說明這個(gè)命令執(zhí)行正確,但是如果我們查看了一個(gè)不存在的文件,使用echo$?會(huì)顯示非零值,我們命令的格式正確但是文件是不存在的,那么這條命令也是錯(cuò)誤的。但是更簡(jiǎn)單的”條件判斷”命令有”test”命令。任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2一、利用test命令的測(cè)試功能當(dāng)需要檢測(cè)系統(tǒng)上面某些文件是否是相關(guān)屬性時(shí),利用test命令是最好的選擇。【實(shí)例9-8】例如想要查看/root/sripts/sript04.sh是否存在時(shí)[root@localhostsripts]#test-e./sript04.sh運(yùn)行結(jié)果不會(huì)顯示任何信息,但是最后可以通過$?或者&&配合||來顯示整個(gè)結(jié)果?!緦?shí)例9-9】test配合&&與||來使用查看結(jié)果[root@localhostsripts]#test-e./sript04.sh&&echo"exist"||echo"Notexist"Notexist[root@localhostsripts]#test-e./sript03.sh&&echo"exist"||echo"Notexist"exist任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2最終顯示的結(jié)果如果為正確的話就會(huì)回顯exist,否則的話回顯Notexisttest命令的-e選項(xiàng)是測(cè)試一個(gè)文件或者目錄是否存在,還有很多選項(xiàng),如表9-2任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2【實(shí)例9-10】編寫shellscript,交互式利用test判斷文件是否存在,若不存在則輸出”文件不存在”,并退出腳本;若文件存在,則判斷該文件是file或者是dir,結(jié)果輸出為”這是一個(gè)file”或者是”這是一個(gè)dir”;并判斷執(zhí)行這對(duì)于文件的權(quán)限,并輸出權(quán)限。任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2說明:第5段為顯示一段信息提示使用者該文件作用;第6段為交互式,提示使用者輸入一個(gè)文件名,變量名為filename第7段去判斷輸入的字符串是否為0,為0的話輸出echo的內(nèi)容,并退出第8段檢測(cè)filename不存在的話,輸出echo的內(nèi)容,并推出第9段判斷是否為文件第10段判斷是否為目錄第11-13段為判斷使用者對(duì)filename的權(quán)限任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2運(yùn)行結(jié)果:[root@localhostsripts]#lssript02.shsript03.shsript04.shsript.shuser.sh[root@localhostsripts]#shsript04.shPleaseenterthefilenametodeterminethefileinformation\nPleaseenterthefilename:sript02.shThefiletypeisfileYouhavewpermissionYouhaverpermissionYouhavexpermission任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2二、利用判斷符合[]進(jìn)行判斷時(shí),除了test這個(gè)命令之外,還有”[]”中括號(hào)符號(hào)來進(jìn)行數(shù)據(jù)的判斷。【實(shí)例9-11】例如判斷PATH變量是否為空[root@localhost~]#[-z"$PATH"];echo$?1-z選項(xiàng)的含義為判斷長(zhǎng)度是否為空為0,為空為0則為true,故返回值為1。在使用中括號(hào)時(shí)需要注意的是,中括號(hào)用在很多地方,比如正則表示式和通配符等,所以如果要使用中括號(hào)在bash的語(yǔ)法中作為判斷式,必須要做注意在中括號(hào)兩端需要有空格來分割。假設(shè)空格用□來表示的話即為[□”$PATH”□==□”$MAIL”□]任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2【實(shí)例9-12】例如,假設(shè)我們?cè)O(shè)置name=hbtx[root@localhostsripts]#name="hbtxhbTangx"[root@localhostsripts]#[$name=="tangxun"]bash:[:參數(shù)太多知識(shí)鏈接:比較運(yùn)算符,用于比較兩個(gè)值之間的關(guān)系;邏輯運(yùn)算符,用于組合和操作多個(gè)條件;字符串比較,用于比較字符串的內(nèi)容;文件判斷,用于判斷文件的屬性和狀態(tài)。
精益求精:利用中括號(hào)的判斷,實(shí)現(xiàn)當(dāng)運(yùn)行一個(gè)程序的時(shí)候,這個(gè)程序會(huì)讓用戶選擇Y或N,如果用戶輸入Y或y,就顯示“OK,continue”,如果用戶輸入n或N,就顯示“Oh,interrupt!”,若都不是則顯示您輸入的不是Y/N任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2[root@localhostsripts]#catsript05.sh#!/bin/bashread-p"Pleaseinput(Y/N)"yn["$yn"=="Y"-o"$yn"=="y"]&&echo"OK,continue"&&exit0["$yn"=="N"-o"$yn"=="n"]&&echo"OK,continue"&&exit0echo"您輸入的不是Y/N"&&exit0運(yùn)行:[root@localhostsripts]#shsript05.shPleaseinput(Y/N)yOK,continue[root@localhostsripts]#shsript05.shPleaseinput(Y/N)l您輸入的不是Y/N任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2三、shellscript的默認(rèn)變量我們都知道命令可以帶有選項(xiàng)以及參數(shù),例如ls-la可以查看所有文件包括隱藏文件的全部屬性。執(zhí)行Shellscript也是可以帶參數(shù)的。1、文件參數(shù)變量在執(zhí)行腳本時(shí),可以向腳本傳遞參數(shù)。$1是第一個(gè)參數(shù),$2是第二個(gè)參數(shù),以此類推,然后還有$0這個(gè)變量,該變量的意思是文件名。任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2【實(shí)例9-13】$1,$2,$0參數(shù)變量的使用[root@localhostsripts]#catsript.sh#!/bin/bash#Thisisatestscript#Time:#2023年06月27日,星期二echo"文件命令是:"$0echo"第一個(gè)參數(shù):"$1echo"第二個(gè)參數(shù):"$2執(zhí)行:[root@localhostsripts]#shsript.shaaabbb文件命令是:sript.sh第一個(gè)參數(shù):aaa第二個(gè)參數(shù):bbbShell腳本后面的第一個(gè)參數(shù)即為$1,第二個(gè)為
$2,以此類推任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2【實(shí)例9-14】$(command)與`command`的示范[root@localhostsripts]#catsript.sh#!/bin/bash#Thisisatestscript#Time:#2023年06月27日,星期二echo"當(dāng)前位置是:`pwd`" //該行使用了``傳參符號(hào),執(zhí)行pwd命令echo"當(dāng)前位置是:pwd" //該行沒有使用任何符號(hào),直接輸入pwd命令echo"當(dāng)前位置是:$(pwd)" //該行使用$()變量,后執(zhí)行pwd命令執(zhí)行:[root@localhostsripts]#shsript.sh當(dāng)前位置是:/root/sripts //該行使用``進(jìn)行傳參,執(zhí)行pwd成功當(dāng)前位置是:pwd //該行沒有加入任何參數(shù),執(zhí)行pwd失敗當(dāng)前位置是:/root/sripts //使用$(),執(zhí)行pwd成功任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2知識(shí)鏈接:不同的Shell解釋器可能會(huì)有一些差異,上述變量在不同的Shell中可能會(huì)有所不同。此外,還有一些環(huán)境變量,如PATH、LANG等,在Shell腳本中也可以使用。精益求精:使用$1.....等位置變量完成加減乘除。任務(wù)準(zhǔn)備:9.2.1判斷式任務(wù)2執(zhí)行:[root@localhostsripts]#shsript10.sh23923+9=3223-9=1423*9=20723/9=2[root@localhostsripts]#shsript10.sh23請(qǐng)輸入2個(gè)數(shù)值,格式為sript10.sh12任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2一、利用if...thenif…then是最常見的條件判斷式。簡(jiǎn)單地說,就是當(dāng)符合某個(gè)條件判斷的時(shí)候,就進(jìn)行某項(xiàng)工作。if…then的判斷還有多層次的情況1.單層、簡(jiǎn)單條件判斷式如果只有一個(gè)判斷式要進(jìn)行,可以簡(jiǎn)單的這樣if[條件判斷式];then當(dāng)條件判斷式成立時(shí),可以進(jìn)行的命令工作內(nèi)容;fi<==將if反過來寫,就成為fi了,結(jié)束if之意任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2【實(shí)例9-15】if....then判斷[root@localhostsripts]#catsript06.sh#!/bin/bashread-p"Pleaseinput(Y/N):"ynif["$yn"=="Y"]||["$yn"=="y"];then echo"OK,continue" exit0fiif["$yn"=="N"]||["$yn"=="n"];then echo"Oh,interrupt!" exit0fi任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2運(yùn)行:[root@localhostsripts]#shsript06.shPleaseinput(Y/N):s[root@localhostsripts]#shsript06.shPleaseinput(Y/N):yOK,continue任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2知識(shí)鏈接:if語(yǔ)句:if語(yǔ)句用于執(zhí)行基于條件的分支。精益求精:在if語(yǔ)句行故意放了一個(gè)不能工作的命令,查看情況[root@localhostsripts]#catsript07.sh#!/bin/bashifnotthen echo"Itworked"fiecho"Weareoutsidetheifstatement"任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2二、多個(gè)條件判斷(if...elif...elif...else)分多種不同情況運(yùn)行if[條件判斷式一];then當(dāng)條件判斷式一成立時(shí),可以進(jìn)行的命令工作內(nèi)容;elif[條件判斷式二];then當(dāng)條件判斷式二成立時(shí),可以進(jìn)行的命令工作內(nèi)容;else當(dāng)條件判斷式一與二均不成立時(shí),可以進(jìn)行的命令工作內(nèi)容;fi任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2【實(shí)例9-16】實(shí)現(xiàn)if...elif...else語(yǔ)句[root@localhostsripts]#catsript06.sh#!/bin/bashread-p"請(qǐng)輸入(Y/N):"ynif["$yn"=="Y"]||["$yn"=="y"];then echo"您輸入的是Y"elif["$yn"=="N"]||["$yn"=="n"];then echo"您輸入的是N!"else echo"請(qǐng)輸入(Y/N)"fi執(zhí)行:[root@localhostsripts]#shsript06.sh請(qǐng)輸入(Y/N):y您輸入的是Y[root@localhostsripts]#shsript06.sh請(qǐng)輸入(Y/N):n您輸入的是N![root@localhostsripts]#shsript06.sh請(qǐng)輸入(Y/N):d請(qǐng)輸入(Y/N)任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2知識(shí)鏈接:if語(yǔ)句:if語(yǔ)句用于執(zhí)行基于條件的分支。精益求精:利用位置變量$1...,讓執(zhí)行者在運(yùn)行腳本時(shí)就將參數(shù)帶進(jìn)去,判斷$1是否為hello,是的話顯示”hello,user”,若沒有加入?yún)?shù)則提示使用者必須添加參數(shù),若不是hello則提示只能使用hello參數(shù)任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2三、利用case...in..esac進(jìn)行判斷case$變量名稱in<==關(guān)鍵字為case,變量前有$符"第一個(gè)變量?jī)?nèi)容")<==每個(gè)變量?jī)?nèi)容建議用雙引號(hào)括起來,關(guān)鍵字則為小括號(hào))程序段;;<==每個(gè)類別結(jié)尾使用兩個(gè)連續(xù)的分號(hào)來處理"第二個(gè)變量?jī)?nèi)容")程序段;;*)<==最后一個(gè)變量?jī)?nèi)容都會(huì)用*來代表所有其他值不包含第一個(gè)變量?jī)?nèi)容與第二個(gè)變量?jī)?nèi)容的其他程序運(yùn)行段exit1;;esac<==最終的case結(jié)尾!思考一下case反過來寫是什么任務(wù)準(zhǔn)備:9.2.2使用條件判斷任務(wù)2【實(shí)例9-17】使用case語(yǔ)法任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2一、whiledodone,untildodone(不定循環(huán))一般來說,不定循環(huán)最常見的就是底下這兩種狀態(tài)了while[condition]<==中括號(hào)內(nèi)的狀態(tài)就是判斷式
do<==do是循環(huán)的開始!
程序段落
done<==done是循環(huán)的結(jié)束while的中文是“當(dāng)……時(shí)”,所以,這種方式說的是“當(dāng)condition條件成立時(shí),就進(jìn)行循環(huán),直到condition的條件不成立才停止”的意思。還有另外一種不定循環(huán)的方式:until[condition]
do
程序段落
done這種方式恰恰與while相反,它說的是當(dāng)condition條件成立時(shí),就終止循環(huán),否則就持續(xù)運(yùn)行循環(huán)的程序段。我們以while來做個(gè)簡(jiǎn)單的練習(xí)。假設(shè)要讓用戶輸入yes或者是YES才結(jié)束程序的運(yùn)行,否則就一直運(yùn)行并告訴用戶輸入字符。任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2【實(shí)例9-18】while循環(huán)[root@localhostsripts]#catsript08.sh#!/bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATHwhile["$yn"!="yes"-a"$yn"!="YES"]do read-p"Pleaseinputyes/YEStostopthisprogram:"yndone echo"OK!youinputthecorrectanswer."運(yùn)行:[root@localhostsripts]#shsript08.shPleaseinputyes/YEStostopthisprogram:yesOK!youinputthecorrectanswer.任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2知識(shí)鏈接:whiledodone在大部分比較實(shí)用的腳本中是常見的。精益求精:實(shí)現(xiàn)腳本進(jìn)行后綴名的更換[root@localhostsripts]#catsript09.sh#!/bin/bashread-p"Pleaseinputtheusername:"userwhile:doifwho|grep-qw$user then echo$userlogin.else echo$usernotloginfi任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2二、使用for...do...done循環(huán)while和until進(jìn)行循環(huán)必須要符合某一個(gè)條件,這一小節(jié)的for循環(huán)則是已經(jīng)知道要進(jìn)行幾次循環(huán)。語(yǔ)法格式如下:forvarinonetowthree..do程序內(nèi)容done以上語(yǔ)法格式意思為:第一次循環(huán)時(shí),$var的內(nèi)容為one,第二次為tow,第三次的內(nèi)容為three。我們之前編寫的批量創(chuàng)建用戶的腳本即是這個(gè)原理。任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2【實(shí)例9-19】假設(shè)有三種動(dòng)物,cat、dog、bird,沒執(zhí)行一行都按”動(dòng)物園里有cat”之類的樣式進(jìn)行輸出。[root@localhostsripts]#catsript13.sh#!/bin/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexportPATHforzoonincatdogbirddo echo"動(dòng)物園里有$zoon"done執(zhí)行:[root@localhostsripts]#shsript13.sh動(dòng)物園里有cat動(dòng)物園里有dog動(dòng)物園里有bird任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2【實(shí)例9-20】獲取主機(jī)的所有用戶[root@localhostsripts]#catuserlist.sh#!/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/binexportPATHuser=`awk-F:'{print$1}'/etc/passwd`forUin$userdo echo"$Uand'id$U`AND">>/tangxun/userlist.txtdone任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2執(zhí)行:[root@localhostsripts]#shuserlist.sh[root@localhostsripts]#cd/tangxun/[root@localhosttangxun]#lsuserlist.txt[root@localhosttangxun]#catuserlist.txtrootanduid=0(root)gid=0(root)組=0(root)binanduid=1(bin)gid=1(bin)組=1(bin)daemonanduid=2(daemon)gid=2(daemon)組=2(daemon)admanduid=3(adm)gid=4(adm)組=4(adm)lpanduid=4(lp)gid=7(lp)組=7(lp)syncanduid=5(sync)gid=0(root)組=0(root)shutdownanduid=6(shutdown)gid=0(root)組=0(root)........任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2【實(shí)例9-21】查找活動(dòng)ip[root@localhostsripts]#catping.sh#!/bin/baships="192.168.100."foriin`seq1254`do ping-c2$ips$1>/dev/nullif[$?==0]then echo"$ip$iisonline"else echo"$ip$iisnotonline"fidone任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2執(zhí)行:[root@localhostsripts]#shping.sh1isnotonline2isonline3isnotonline.......實(shí)例9-21中重點(diǎn)為seq命令,該命令是sequence連續(xù)的意思,代表后面的兩個(gè)數(shù)字都是連續(xù)的,這樣就可以把這些數(shù)字帶入到程序中。任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2三、for...do...done數(shù)值處理除了之前講倒的方法意外,for循環(huán)還有一種語(yǔ)法:for((初始值,限制值;執(zhí)行步長(zhǎng)))do程序內(nèi)容done這種語(yǔ)法適用于數(shù)值方式的運(yùn)算,在for后面的括號(hào)內(nèi)的參數(shù)含義如下:初始值:某個(gè)變量在循環(huán)當(dāng)中的起始位置,好比與i=1.限制值:最大值,獎(jiǎng)值范圍控制在這個(gè)范圍內(nèi)。執(zhí)行不長(zhǎng):每次循環(huán)之后,變量的變化量,設(shè)置2的話為1,3,5任務(wù)準(zhǔn)備:9.2.3使用循環(huán)任務(wù)2【實(shí)例9-22】基于這種語(yǔ)法,來修改ping.sh[root@localhostsripts]#catping.sh#!/bin/baships="192.168.100."for((i=1;i<=10;i=i+1))do ping-c2$ips$i>/dev/nullif[$?==0]then echo"$ip$iisonline"else echo"$ip$iisnotonline"fidone設(shè)置從1開始,每次+1,截止到10。任務(wù)準(zhǔn)備:9.2.4對(duì)shellscript進(jìn)行調(diào)試任務(wù)2script在運(yùn)行之前,最怕的就是出現(xiàn)語(yǔ)法錯(cuò)誤問題了!那么我們?cè)撊绾握{(diào)試呢?有沒有辦法不需要運(yùn)行該script就可以判斷是否有問題呢?當(dāng)然是有的!下面就直接以bash的相關(guān)參數(shù)來進(jìn)行判斷。格式:sh[nvx]script.sh選項(xiàng)與參數(shù):-n:不要執(zhí)行script,僅查詢語(yǔ)法的問題。-v:在執(zhí)行script前,先將script的內(nèi)容輸出到屏幕上。-x:將使用到的script內(nèi)容顯示到屏幕上,這是很有用的參數(shù)!測(cè)試查看script08.sh的語(yǔ)法是否有錯(cuò)誤[root@localhostsripts]#sh-nsript08.sh沒有錯(cuò)誤的話不會(huì)顯示任何信息將srcipt08.sh的運(yùn)行過程全部列出來任務(wù)準(zhǔn)備:9.2.4對(duì)shellscript進(jìn)行調(diào)試任務(wù)2[root@localhostsripts]#sh-xsript08.sh+PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/root/bi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度藥店藥品零售連鎖品牌授權(quán)及供應(yīng)鏈合同
- 二零二五年度涉及知識(shí)產(chǎn)權(quán)的方協(xié)議解約及糾紛解決合同
- 不動(dòng)產(chǎn)買賣合同書及補(bǔ)充協(xié)議條款
- 英文短句記憶技巧教案
- 海底兩萬里觀后感體會(huì)
- 農(nóng)業(yè)經(jīng)濟(jì)政策解讀方案
- 傳媒廣告行業(yè)廣告效果數(shù)據(jù)分析與優(yōu)化方案
- 互聯(lián)網(wǎng)+健康產(chǎn)業(yè)服務(wù)協(xié)議
- 倉(cāng)庫(kù)庫(kù)房租賃合同書
- 童話森林的故事解讀
- 美術(shù)社團(tuán)活動(dòng)記錄
- 醫(yī)療機(jī)構(gòu)注銷登記申請(qǐng)書
- GB/T 678-2023化學(xué)試劑乙醇(無水乙醇)
- 影視鑒賞-第一章-認(rèn)識(shí)電影-課件
- 船舶塢修廠修工程單審批稿
- 教科版小學(xué)科學(xué)三年級(jí)上冊(cè)《空氣》單元解讀與試教課件
- 電機(jī)學(xué)同步電機(jī)-全套課件
- 公路工程施工安全管理及其實(shí)例
- 教科版高中信息技術(shù)(2019)必修一全冊(cè)教案
- 左洛復(fù)怡諾思專家講座
- 行政確認(rèn)專題教育課件
評(píng)論
0/150
提交評(píng)論