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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Linux自動化運維項目4:Shell數組與函數

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

#returnvalue}#function_name表示函數名,函數名不能以數字開頭,可以包含字母、數字和下畫線。#函數體位于花括號內,可以包含任意數量的命令和語句以及可選的參數。#value表示函數的返回值,函數的返回值可以使用return語句指定,如果未指定返回值,則默認返回最后一個命令的退出狀態碼。定義和調用函數定義簡單的函數,用于輸出當前日期和時間。print_datetime(){echo"Thecurrentdateandtimeare:$(date)"}定義函數后,可以在腳本中使用函數名來調用函數,也可以給函數傳遞參數。調用函數的語法如下:function_name#其中,function_name表示要調用的函數的名稱,arguments表示傳遞給函數的參數,這些參數可以是位置參數或關鍵字參數。在Shell腳本中調用函數,輸出當前日期和時間。print_datetime(){echo"Thecurrentdateandtimeare:$(date)"}print_datetime02函數參數位置參數在執行函數時,函數可以接收輸入參數并執行相應的操作,這些參數可以是位置參數或關鍵字參數。位置參數是指在函數調用時按照參數的位置順序傳遞給函數的值,這些參數按照在命令行中出現的順序從1開始依次編號。在函數體內部,位置參數可以通過$1,$2,$3,...,$n的形式來引用,其中$1表示第一個參數,$2表示第二個參數,以此類推,$n表示第n個參數。調用函數并指定傳遞的參數值時,這些參數值會自動賦給位置參數。常見的位置參數如下表所示。序號參數描述1$0表示當前腳本或函數的名稱2$@表示所有位置參數的列表,將每個位置參數作為獨立的字符串返回3$#表示位置參數的個數,即傳遞給函數的參數數量4$*表示所有位置參數的列表,將所有位置參數作為一個字符串返回5$?用于獲取上一個命令或函數的退出狀態碼(返回值)。它表示上一個命令或函數的執行結果位置參數在函數中輸出不同位置參數的示例如下:#!/bin/bashfunctionfoo(){echo"Thescriptnameis:$0"echo"Thefirstargumentis:$1"echo"Thesecondargumentis:$2"echo"Thenumberofargumentsis:$#"echo"Allargumentsasasingleword:$*"echo"Allargumentsasseparatewords:$@"}fooarg1arg2arg3#執行腳本bashfunc-para.sh腳本定義了一個名為foo的函數,該函數使用了一些特殊的Shell參數來處理腳本和函數的輸入參數。它通過調用foo函數并傳遞arg1arg2arg3作為參數來展示這些特殊參數的使用。$0是特殊參數,代表當前執行的腳本的名字。在函數內部,它仍然代表腳本名,而不是函數名。$1是傳遞給函數或腳本的第一個參數,在這個腳本的上下文中,它將是arg1。$2代表傳遞給函數或腳本的第二個參數,這里為arg2。$#代表傳遞給函數的參數個數。在這個腳本中,由于傳遞給foo的參數有三個,$#將會是3。$*將所有傳遞給函數的參數視為一個整體,參數之間默認由空格分隔。如果要將所有參數視為一個單一字符串,經常會用到"$*"。$@與$*不同的是,$@會將每個參數作為獨立的引用字符串處理。在腳本中經常用于循環遍歷所有參數,特別是當參數本身可能包含空格時。位置參數在函數中使用位置參數來計算兩個數的和,具體示例如下:#定義一個函數,計算兩個數的和sum(){localnum1=$1#使用第一個位置參數localnum2=$2#使用第二個位置參數localresult=$((num1+num2))echo"Thesumof$num1and$num2is:$result"}#調用函數,并傳遞位置參數sum1020上述示例中,定義了一個名為sum的函數,它接收兩個位置參數$1和$2。在函數體內部,將位置參數的值分別賦給num1和num2變量,并使用$((num1+num2))表達式進行加法運算,得到和result。最后通過調用sum函數來執行加法運算,在函數調用中,按照順序傳遞參數10和20,這些參數將作為位置參數傳遞給函數。關鍵字參數關鍵字參數是指在函數調用時使用關鍵字-值對的形式傳遞給函數的參數。使用關鍵字參數,可以明確指定參數的名稱,而不依賴于參數的位置順序。在函數體內部,可以使用${parameter_name}的形式來訪問傳遞的關鍵字參數。調用函數時,使用parameter_name=value的形式來給函數傳遞參數。其中,函數print_info接收關鍵字參數name、age和country。在函數內部,通過for語句將關鍵字參數傳遞給函數的參數列表$@,使用case語句對參數進行解析。函數參數#!/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在函數中使用關鍵字參數來輸出給定信息,具體示例如下:腳本中的print_info函數接收三個模擬的關鍵字參數:name、age和country。在函數內部,使用for循環遍歷函數參數列表$@。對于每個參數,使用case語句和參數擴展來提取關鍵字后的值。通過移除等號=及其前面的部分來實現(${arg#*=}),保留參數值。最后,函數打印出提取的參數值。03函數返回值函數返回值在Shell腳本中,函數可以通過return語句返回一個值,返回值可以是整數,取值范圍為0~255。返回值用于表示函數執行的狀態或結果,并可以在函數調用時進行處理或判斷。當調用函數并接收其返回值時,$?變量保存了上一個命令或函數的退出狀態碼,可以使用$?變量來獲取函數的返回值。functionmy_func(){localresult="hello"return42}my_funcecho"my_funcreturned$?"#執行腳本,輸出結果my_funcreturned42函數返回值函數的返回值默認是整數,如果需要返回其他類型的值,如字符串或其他數據,可使用echo命令將值輸出到標準輸出中,然后在調用函數時使用命令替換來獲取返回值。在上述示例中,my_func函數將字符串hello輸出到標準輸出中,然后在調用my_func時使用命令替換將輸出的字符串賦給變量result,最終輸出的結果為my_funcreturnedhello。functionmy_func(){localresult="hello"echo"$result"}result=$(my_func)echo"my_funcreturned$result"#執行腳本,輸出結果my_funcreturnedhello04變量作用域變量作用域變量作用域指的是變量可以被訪問的范圍。在Shell函數中,變量分為全局變量和局部變量,全局變量在腳本的任何地方都可以訪問,而局部變量僅在函數內部可訪問。默認情況下,在函數內部可以直接訪問和使用函數外部定義的變量,而無須使用特殊的關鍵字,這樣的行為可能導致變量混淆和數據錯誤修改。為了避免這種情況,可以使用local或者declare關鍵字來聲明局部變量,使其僅在當前函數內部有效,不會影響外部同名變量的值。在函數內部使用local關鍵字聲明的變量,只在該函數內部有效,函數外部無法訪問該變量。使用local關鍵字聲明局部變量:function_name(){localvariable_name=value#函數內部代碼塊}變量作用域使用declare關鍵字聲明的變量,如果是在函數內部聲明的,則為局部變量,只在該函數內部有效;如果是在函數外部聲明的,則為全局變量,在整個腳本中有效。使用declare關鍵字聲明局部變量:注意:定義函數不會導致函數被執行,在沒有主動調用函數時,無論是全局變量還是局部變量,都不能在函數外部和內部調用。function_name(){declarevariable_name=value#函數內部代碼塊}變量作用域全局變量和使用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"#調用函數my_function#執行腳本,輸出結果Outsidefunction:Outsidefunction:GlobalInsidefunction:LocalInsidefunction:Globa全局變量global_variable被設置為字符串"Global"。在腳本中任何地方都是可見的。定義了一個名為my_function的函數,在這個函數內部聲明了一個局部變量local_variable,被設置為字符串"Local"。局部變量只在函數內部可見。函數內部使用echo命令打印局部變量local_variable和全局變量global_variable的值。在函數外部也使用echo嘗試打印這兩個變量的值。由于local_variable是局部變量,它在函數外部不可見,所以打印為空。而全局變量global_variable在任何地方都可見,因此它的值"Global"被打印出來。在腳本的末尾調用了my_function函數,腳本輸出函數內外對變量的打印結果。變量作用域全局變量和使用declare聲明的局部變量的作用域,具體示例如下:global_var="GlobalVariable"modify_variable(){declare-llocal_var="LOWercase"echo"Ins

溫馨提示

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

評論

0/150

提交評論