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

提交评论