Linux自動化運維(Shell與Ansible)(微課版) 課件 項目4 Shell 數(shù)組與函數(shù)_第1頁
Linux自動化運維(Shell與Ansible)(微課版) 課件 項目4 Shell 數(shù)組與函數(shù)_第2頁
Linux自動化運維(Shell與Ansible)(微課版) 課件 項目4 Shell 數(shù)組與函數(shù)_第3頁
Linux自動化運維(Shell與Ansible)(微課版) 課件 項目4 Shell 數(shù)組與函數(shù)_第4頁
Linux自動化運維(Shell與Ansible)(微課版) 課件 項目4 Shell 數(shù)組與函數(shù)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Linux自動化運維項目4:Shell數(shù)組與函數(shù)

學(xué)習(xí)目標(biāo)【知識目標(biāo)】了解Shell數(shù)組的基本概念。了解Shell函數(shù)基本概念和語法。了解函數(shù)的參數(shù)和變量作用域?!炯寄苣繕?biāo)】掌握數(shù)組的定義和使用方法。掌握函數(shù)的定義和使用方法。掌握函數(shù)參數(shù)的使用方法和變量的作用域?!舅刭|(zhì)目標(biāo)】培養(yǎng)讀者的責(zé)任感和獨立思考能力,使其能夠?qū)ψ约旱男袨楹蜎Q策負(fù)責(zé),并能夠獨立思考問題,做出明智的選擇。培養(yǎng)讀者的邏輯思維能力,使其能夠分析問題,形成嚴(yán)密的推理和論證思維。培養(yǎng)讀者的安全意識,使其注重Shell腳本編程的安全性,避免代碼中出現(xiàn)漏洞,保護(hù)系統(tǒng)的安全。Shell數(shù)組與函數(shù)任務(wù)1:創(chuàng)建和使用數(shù)組目錄/Contents010203索引數(shù)組關(guān)聯(lián)數(shù)組IFS01索引數(shù)組索引數(shù)組數(shù)組是一種重要的數(shù)據(jù)結(jié)構(gòu),用于存儲和操作一組相關(guān)的數(shù)據(jù)。在Shell中,數(shù)組分為索引數(shù)組和關(guān)聯(lián)數(shù)組。索引數(shù)組是一種常見的數(shù)組類型,用于存儲有序的數(shù)據(jù)集合,數(shù)組的每個元素都有一個唯一的索引標(biāo)識其位置,可以使用該索引訪問數(shù)組中的元素,數(shù)組的第一個元素的索引通常是0,第二個元素的索引是1,以此類推。定義索引數(shù)組my_array=(value1value2value3...)上述示例中,my_array表示數(shù)組名,value1、value2、value3等表示數(shù)組元素。linuxos=("openeuler""rhel""centos""ubuntu")linuxversion=(922107)在上述示例中,linuxos數(shù)組包含openeuler、rhel、centos、ubuntu等數(shù)組元素,linuxversion數(shù)組包含9、22、10、7等數(shù)組元素。在Shell中,可以通過使用圓括號和一系列值來定義索引數(shù)組,數(shù)組元素可以是任何Shell支持的數(shù)據(jù),包括字符串、數(shù)字、命令輸出等。訪問數(shù)組元素索引數(shù)組的元素根據(jù)索引進(jìn)行訪問和操作,索引從0開始。其中,my_array表示數(shù)組名,index表示要訪問的元素的索引。注意,數(shù)組索引從0開始,如果要訪問數(shù)組linuxos的第一個元素,可以使用${linuxos[0]}。linuxos=("openeuler""rhel""centos""ubuntu")echo"${linuxos[0]}"#輸出:openeuler${my_array[index]}修改、刪除數(shù)組元素和獲取數(shù)組長度通過索引將新值賦給數(shù)組元素來修改數(shù)組中的元素。linuxos[2]="centosstream"echo${linuxos[2]}#輸出:centosstream可以使用${#array[@]}來獲取數(shù)組的長度,即數(shù)組元素的個數(shù)。length=${#linuxos[@]}echo"數(shù)組元素個數(shù):$length"#輸出:數(shù)組元素個數(shù):4使用unsetarray[index]命令刪除數(shù)組元素,array表示數(shù)組名,index表示要刪除的數(shù)組元素的索引。比如刪除數(shù)組中索引為2的元素,可使用unsetlinuxos[2]命令。unsetlinuxos[2]遍歷數(shù)組使用for語句遍歷索引數(shù)組的所有元素,具體示例如下:linuxos=("openeuler""rhel""centos""ubuntu")forosin"${linuxos[@]}"doecho"$os"done使用while語句遍歷索引數(shù)組的所有元素,具體示例如下:linuxos=("openeuler""rhel""centos""ubuntu")len=${#linuxos[@]}i=0while[$i-lt$len];doecho"${linuxos[$i]}"i=$((i+1))doneShell數(shù)組表達(dá)式在使用for語句和while語句遍歷數(shù)組時,需要使用特定的表達(dá)式來訪問數(shù)組的元素。數(shù)組表達(dá)式是一種特殊的語法,用于訪問數(shù)組中的元素或者獲取數(shù)組的長度等信息。常見的訪問Shell數(shù)組表達(dá)式如表所示:序號表達(dá)式描述1${array[*]}將數(shù)組array的所有元素作為一個整體返回2${array[@]}將數(shù)組array的所有元素作為獨立的值返回3${!array[*]}將數(shù)組array的索引列表作為一個整體返回4${!array[@]}將數(shù)組array的索引作為獨立的值返回5${#array[@]}返回數(shù)組array的元素個數(shù)6${#array}返回數(shù)組array中索引為0的元素的長度7${array[0]}返回數(shù)組array中索引為0的元素8${array[@]:1}返回數(shù)組array中從索引1開始的所有元素9${array[@]:0:3}返回數(shù)組array中從索引0開始的兩個元素10${#array[2]}返回數(shù)組array中索引為2的元素的長度11${array}返回數(shù)組array的第一個元素02關(guān)聯(lián)數(shù)組關(guān)聯(lián)數(shù)組關(guān)聯(lián)數(shù)組(也稱為哈希表或字典)是一種用于存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),數(shù)組中每個鍵都對應(yīng)一個值。可以將關(guān)聯(lián)數(shù)組視為字典(dictionary)或映射,其中鍵是字符串,值可以是任意類型的數(shù)據(jù)。關(guān)聯(lián)數(shù)組的每個元素都有一個唯一的鍵與之關(guān)聯(lián)。關(guān)聯(lián)數(shù)組是Bash4.0開始支持的數(shù)組類型。關(guān)聯(lián)數(shù)組必須首先被聲明,才能使用。使用declare-A命令來聲明一個關(guān)聯(lián)數(shù)組,聲明關(guān)聯(lián)數(shù)組示例如下:declare-Aarray_name也可以在聲明時直接初始化關(guān)聯(lián)數(shù)組:declare-Adistrosdistros=(["Ubuntu"]="GNOME"["Fedora"]="GNOME"["Mint"]="Cinnamon"["Debian"]="GNOME"["Manjaro"]="XFCE")添加、修改和刪除關(guān)聯(lián)數(shù)組元素為關(guān)聯(lián)數(shù)組array_name添加3個元素,每個元素由一個鍵和一個關(guān)聯(lián)的值組成。鍵使用key表示,值使用value表示。array_name[key1]=value1array_name[key2]=value2array_name[key3]=value3訪問關(guān)聯(lián)數(shù)組元素echo${array_name[key1]}修改關(guān)聯(lián)數(shù)組元素array_name[key1]="openeuler"echo${array_name[key1]}#輸出:openeuler刪除元素unsetarray_name["key1"]關(guān)聯(lián)數(shù)組獲取關(guān)聯(lián)數(shù)組所有鍵echo${!array_name[@]}#輸出:key3key2key1遍歷關(guān)聯(lián)數(shù)組元素forkeyin"${!array_name[@]}"doecho"Key:$key,Value:${array_name[$key]}"done#輸出:Key:key3,Value:value3Key:key2,Value:value2Key:key1,Value:openeulerforkeyin“${!array_name[@]}”循環(huán)遍歷數(shù)組array_name的所有鍵。${!array_name[@]}是一種特殊的Shell擴(kuò)展,用于獲取關(guān)聯(lián)數(shù)組的所有鍵。do...done是for循環(huán)的主體部分。do后面跟著循環(huán)體,done表示循環(huán)體的結(jié)束。echo"Key:$key,Value:${array_name[$key]}"命令用于打印當(dāng)前鍵($key)及其對應(yīng)的值(${array_name[$key]})。數(shù)組元素的值通過${array_name[$key]}來獲取,其中$key是當(dāng)前迭代的鍵。03IFSIFS在Shell腳本中,IFS(InternalFieldSeparator,內(nèi)部字段分隔符)是一個內(nèi)部變量,用于指定分隔項目列表或值列表的分隔符。默認(rèn)情況下,IFS的值可以為空格、制表符和換行符等,也可以根據(jù)需要自定義。在特定的場景下,可以使用IFS來分隔字符串,并將分隔后的值存儲到Shell數(shù)組中。IFS基本語法如下:IFS=<separator>其中,“separator”表示指定的分隔符??梢允褂脝蝹€字符或多個字符作為分隔符,多個字符之間不需要使用分隔符分隔開。line="HelloWorld"IFS=""read-rafields<<<"$line"echo"${fields[0]}"#輸出:Helloecho"${fields[1]}"#輸出:World通過空格分隔字符串,具體示例如下:IFS使用IFS指定一個自定義的分隔符。使用IFS指定一個自定義的分隔符。#!/bin/bash#聲明一個含有多個字段的字符串string="apple,banana,orange,mango"#使用IFS指定逗號作為分隔符IFS=","#將字符串分隔成多個字段,并輸出每個字段foritemin$stringdoecho$itemdone輸出結(jié)果為:applebananaorangemango示例中,通過將IFS變量值設(shè)置為逗號,把字符串"apple,banana,orange,mango"分成了4個字段,最后使用for語句遍歷數(shù)組中的每個元素,并將其輸出。謝謝Shell數(shù)組與函數(shù)任務(wù)2:創(chuàng)建和使用函數(shù)目錄/Contents01020304定義和調(diào)用函數(shù)函數(shù)參數(shù)函數(shù)返回值變量作用域01定義和調(diào)用函數(shù)定義和調(diào)用函數(shù)函數(shù)是計算機(jī)編程中的一個重要概念,幾乎所有的編程語言都支持函數(shù)。函數(shù)提供一種結(jié)構(gòu)化的方式來組織和重用代碼,可以將一段邏輯相關(guān)的代碼封裝在一個函數(shù)中,并在需要的時候進(jìn)行調(diào)用。在Shell中,可自定義函數(shù)并在腳本中調(diào)用,通過參數(shù)傳遞和返回值處理來實現(xiàn)復(fù)雜的邏輯處理,以降低代碼的重復(fù)性,提高代碼的可讀性和可維護(hù)性在Shell中定義函數(shù)的基本語法如下:#方式1function_name(){#函數(shù)體}#方式2functionfunction_name{#函數(shù)體

#returnvalue}#function_name表示函數(shù)名,函數(shù)名不能以數(shù)字開頭,可以包含字母、數(shù)字和下畫線。#函數(shù)體位于花括號內(nèi),可以包含任意數(shù)量的命令和語句以及可選的參數(shù)。#value表示函數(shù)的返回值,函數(shù)的返回值可以使用return語句指定,如果未指定返回值,則默認(rèn)返回最后一個命令的退出狀態(tài)碼。定義和調(diào)用函數(shù)定義簡單的函數(shù),用于輸出當(dāng)前日期和時間。print_datetime(){echo"Thecurrentdateandtimeare:$(date)"}定義函數(shù)后,可以在腳本中使用函數(shù)名來調(diào)用函數(shù),也可以給函數(shù)傳遞參數(shù)。調(diào)用函數(shù)的語法如下:function_name#其中,function_name表示要調(diào)用的函數(shù)的名稱,arguments表示傳遞給函數(shù)的參數(shù),這些參數(shù)可以是位置參數(shù)或關(guān)鍵字參數(shù)。在Shell腳本中調(diào)用函數(shù),輸出當(dāng)前日期和時間。print_datetime(){echo"Thecurrentdateandtimeare:$(date)"}print_datetime02函數(shù)參數(shù)位置參數(shù)在執(zhí)行函數(shù)時,函數(shù)可以接收輸入?yún)?shù)并執(zhí)行相應(yīng)的操作,這些參數(shù)可以是位置參數(shù)或關(guān)鍵字參數(shù)。位置參數(shù)是指在函數(shù)調(diào)用時按照參數(shù)的位置順序傳遞給函數(shù)的值,這些參數(shù)按照在命令行中出現(xiàn)的順序從1開始依次編號。在函數(shù)體內(nèi)部,位置參數(shù)可以通過$1,$2,$3,...,$n的形式來引用,其中$1表示第一個參數(shù),$2表示第二個參數(shù),以此類推,$n表示第n個參數(shù)。調(diào)用函數(shù)并指定傳遞的參數(shù)值時,這些參數(shù)值會自動賦給位置參數(shù)。常見的位置參數(shù)如下表所示。序號參數(shù)描述1$0表示當(dāng)前腳本或函數(shù)的名稱2$@表示所有位置參數(shù)的列表,將每個位置參數(shù)作為獨立的字符串返回3$#表示位置參數(shù)的個數(shù),即傳遞給函數(shù)的參數(shù)數(shù)量4$*表示所有位置參數(shù)的列表,將所有位置參數(shù)作為一個字符串返回5$?用于獲取上一個命令或函數(shù)的退出狀態(tài)碼(返回值)。它表示上一個命令或函數(shù)的執(zhí)行結(jié)果位置參數(shù)在函數(shù)中輸出不同位置參數(shù)的示例如下:#!/bin/bashfunctionfoo(){echo"Thescriptnameis:$0"echo"Thefirstargumentis:$1"echo"Thesecondargumentis:$2"echo"Thenumberofargumentsis:$#"echo"Allargumentsasasingleword:$*"echo"Allargumentsasseparatewords:$@"}fooarg1arg2arg3#執(zhí)行腳本bashfunc-para.sh腳本定義了一個名為foo的函數(shù),該函數(shù)使用了一些特殊的Shell參數(shù)來處理腳本和函數(shù)的輸入?yún)?shù)。它通過調(diào)用foo函數(shù)并傳遞arg1arg2arg3作為參數(shù)來展示這些特殊參數(shù)的使用。$0是特殊參數(shù),代表當(dāng)前執(zhí)行的腳本的名字。在函數(shù)內(nèi)部,它仍然代表腳本名,而不是函數(shù)名。$1是傳遞給函數(shù)或腳本的第一個參數(shù),在這個腳本的上下文中,它將是arg1。$2代表傳遞給函數(shù)或腳本的第二個參數(shù),這里為arg2。$#代表傳遞給函數(shù)的參數(shù)個數(shù)。在這個腳本中,由于傳遞給foo的參數(shù)有三個,$#將會是3。$*將所有傳遞給函數(shù)的參數(shù)視為一個整體,參數(shù)之間默認(rèn)由空格分隔。如果要將所有參數(shù)視為一個單一字符串,經(jīng)常會用到"$*"。$@與$*不同的是,$@會將每個參數(shù)作為獨立的引用字符串處理。在腳本中經(jīng)常用于循環(huán)遍歷所有參數(shù),特別是當(dāng)參數(shù)本身可能包含空格時。位置參數(shù)在函數(shù)中使用位置參數(shù)來計算兩個數(shù)的和,具體示例如下:#定義一個函數(shù),計算兩個數(shù)的和sum(){localnum1=$1#使用第一個位置參數(shù)localnum2=$2#使用第二個位置參數(shù)localresult=$((num1+num2))echo"Thesumof$num1and$num2is:$result"}#調(diào)用函數(shù),并傳遞位置參數(shù)sum1020上述示例中,定義了一個名為sum的函數(shù),它接收兩個位置參數(shù)$1和$2。在函數(shù)體內(nèi)部,將位置參數(shù)的值分別賦給num1和num2變量,并使用$((num1+num2))表達(dá)式進(jìn)行加法運算,得到和result。最后通過調(diào)用sum函數(shù)來執(zhí)行加法運算,在函數(shù)調(diào)用中,按照順序傳遞參數(shù)10和20,這些參數(shù)將作為位置參數(shù)傳遞給函數(shù)。關(guān)鍵字參數(shù)關(guān)鍵字參數(shù)是指在函數(shù)調(diào)用時使用關(guān)鍵字-值對的形式傳遞給函數(shù)的參數(shù)。使用關(guān)鍵字參數(shù),可以明確指定參數(shù)的名稱,而不依賴于參數(shù)的位置順序。在函數(shù)體內(nèi)部,可以使用${parameter_name}的形式來訪問傳遞的關(guān)鍵字參數(shù)。調(diào)用函數(shù)時,使用parameter_name=value的形式來給函數(shù)傳遞參數(shù)。其中,函數(shù)print_info接收關(guān)鍵字參數(shù)name、age和country。在函數(shù)內(nèi)部,通過for語句將關(guān)鍵字參數(shù)傳遞給函數(shù)的參數(shù)列表$@,使用case語句對參數(shù)進(jìn)行解析。函數(shù)參數(shù)#!/bin/bashfunctionprint_info(){localname=""localage=""localcountry=""

forargin"$@";docase$arginname=*)name=${arg#*=};;age=*)age=${arg#*=};;country=*)country=${arg#*=};;esacdone

echo"Name:$name,Age:$age,Country:$country"}print_infoname=Johnage=30country=USA在函數(shù)中使用關(guān)鍵字參數(shù)來輸出給定信息,具體示例如下:腳本中的print_info函數(shù)接收三個模擬的關(guān)鍵字參數(shù):name、age和country。在函數(shù)內(nèi)部,使用for循環(huán)遍歷函數(shù)參數(shù)列表$@。對于每個參數(shù),使用case語句和參數(shù)擴(kuò)展來提取關(guān)鍵字后的值。通過移除等號=及其前面的部分來實現(xiàn)(${arg#*=}),保留參數(shù)值。最后,函數(shù)打印出提取的參數(shù)值。03函數(shù)返回值函數(shù)返回值在Shell腳本中,函數(shù)可以通過return語句返回一個值,返回值可以是整數(shù),取值范圍為0~255。返回值用于表示函數(shù)執(zhí)行的狀態(tài)或結(jié)果,并可以在函數(shù)調(diào)用時進(jìn)行處理或判斷。當(dāng)調(diào)用函數(shù)并接收其返回值時,$?變量保存了上一個命令或函數(shù)的退出狀態(tài)碼,可以使用$?變量來獲取函數(shù)的返回值。functionmy_func(){localresult="hello"return42}my_funcecho"my_funcreturned$?"#執(zhí)行腳本,輸出結(jié)果my_funcreturned42函數(shù)返回值函數(shù)的返回值默認(rèn)是整數(shù),如果需要返回其他類型的值,如字符串或其他數(shù)據(jù),可使用echo命令將值輸出到標(biāo)準(zhǔn)輸出中,然后在調(diào)用函數(shù)時使用命令替換來獲取返回值。在上述示例中,my_func函數(shù)將字符串hello輸出到標(biāo)準(zhǔn)輸出中,然后在調(diào)用my_func時使用命令替換將輸出的字符串賦給變量result,最終輸出的結(jié)果為my_funcreturnedhello。functionmy_func(){localresult="hello"echo"$result"}result=$(my_func)echo"my_funcreturned$result"#執(zhí)行腳本,輸出結(jié)果my_funcreturnedhello04變量作用域變量作用域變量作用域指的是變量可以被訪問的范圍。在Shell函數(shù)中,變量分為全局變量和局部變量,全局變量在腳本的任何地方都可以訪問,而局部變量僅在函數(shù)內(nèi)部可訪問。默認(rèn)情況下,在函數(shù)內(nèi)部可以直接訪問和使用函數(shù)外部定義的變量,而無須使用特殊的關(guān)鍵字,這樣的行為可能導(dǎo)致變量混淆和數(shù)據(jù)錯誤修改。為了避免這種情況,可以使用local或者declare關(guān)鍵字來聲明局部變量,使其僅在當(dāng)前函數(shù)內(nèi)部有效,不會影響外部同名變量的值。在函數(shù)內(nèi)部使用local關(guān)鍵字聲明的變量,只在該函數(shù)內(nèi)部有效,函數(shù)外部無法訪問該變量。使用local關(guān)鍵字聲明局部變量:function_name(){localvariable_name=value#函數(shù)內(nèi)部代碼塊}變量作用域使用declare關(guān)鍵字聲明的變量,如果是在函數(shù)內(nèi)部聲明的,則為局部變量,只在該函數(shù)內(nèi)部有效;如果是在函數(shù)外部聲明的,則為全局變量,在整個腳本中有效。使用declare關(guān)鍵字聲明局部變量:注意:定義函數(shù)不會導(dǎo)致函數(shù)被執(zhí)行,在沒有主動調(diào)用函數(shù)時,無論是全局變量還是局部變量,都不能在函數(shù)外部和內(nèi)部調(diào)用。function_name(){declarevariable_name=value#函數(shù)內(nèi)部代碼塊}變量作用域全局變量和使用local聲明的局部變量的作用域,具體示例如下:#!/bin/bash#全局變量global_variable="Global"functionmy_function(){#局部變量

locallocal_variable="Local"echo"Insidefunction:$local_variable"echo"Insidefunction:$global_variable"}echo"Outsidefunction:$local_variable"echo"Outsidefunction:$global_variable"#調(diào)用函數(shù)my_function#執(zhí)行腳本,輸出結(jié)果Outsidefunction:Outsidefunction:GlobalInsidefunction:LocalInsidefunction:Globa全局變量global_variable被設(shè)置為字符串"Global"。在腳本中任何地方都是可見的。定義了一個名為my_function的函數(shù),在這個函數(shù)內(nèi)部聲明了一個局部變量local_variable,被設(shè)置為字符串"Local"。局部變量只在函數(shù)內(nèi)部可見。函數(shù)內(nèi)部使用echo命令打印局部變量local_variable和全局變量global_variable的值。在函數(shù)外部也使用echo嘗試打印這兩個變量的值。由于local_variable是局部變量,它在函數(shù)外部不可見,所以打印為空。而全局變量global_variable在任何地方都可見,因此它的值"Global"被打印出來。在腳本的末尾調(diào)用了my_function函數(shù),腳本輸出函數(shù)內(nèi)外對變量的打印結(jié)果。變量作用域全局變量和使用declare聲明的局部變量的作用域,具體示例如下:global_var="GlobalVariable"modify_variable(){declare-llocal_var="LOWercase"echo"Ins

溫馨提示

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

最新文檔

評論

0/150

提交評論