当前位置: 首页 > Linux

Linux_《Linux命令行与shell脚本编程大全》Chapter17StudySummary

时间:2023-04-06 01:53:37 Linux

时间:2017-10-09周一注:本文部分内容摘自《Linux命令行与shell脚本编程大全》一书,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十七章学习总结第十七章:创建函数本章内容基本脚本函数返回值在函数中使用变量分组变量和函数创建库在命令行使用函数17.1基本脚本函数17.1.1创建一个函数格式1函数名{commands}格式2name(){commands}描述name属性定义了函数的唯一名称。Commands是一个或多个构成函数的bashshell命令。17.1.2使用函数编写test1.sh脚本#!/bin/bashfunctionfunc1{echo"Thisisanexampleofafunction"}count=1while[$count-le5]dofunc1count=$[$count+1]doneecho"Thisistheendoftheloop"func1echo"Nowthisistheendofthescript"function需要先定义,然后用来写test2.sh脚本#!/bin/bashcount=1echo"这一行来了在函数定义之前"functionfunc1{echo"Thisisanexampleofafunction"}while[$count-le5]dofunc1count=$[$count+1]doneecho"Thisistheendofloop"func2echo"现在脚本结束"functionfunc2{echo"Thisisanexampleofafunction"}函数名必须唯一,否则新定义的函数会覆盖原来的函数编写test3.sh脚本#!/bin/bashfunctionfunc1{echo"Thisisthefirstdefinitionofthefunctionname"}func1functionfunc1{echo"Thisisarepeatofthesamefunctionname"}func1echo"Thisistheendofthescript"17.2返回值bashshell将函数视为一个小脚本,并在运行结束时返回一个退出状态代码17.2.1默认退出状态code默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码,函数执行后,可以通过标准变量$?来判断函数的退出状态码,它当其他命令使用函数的默认退出状态代码时编写test4.sh脚本是非常危险的#!/bin/bashfunc1(){echo"tryingtodisplayanon-existentfile"ls-lbadfile}echo"testingthefunction:"func1echo"Theexitstatusis:$?"17.2.2使用return命令使用return命令退出函数,返回一个退出状态码,指定一个整数值。当函数结束时,返回返回值退出状态码必须是0~255test5.shscript#!/bin/bashfunctiondb1{read-p"Enteravalue:"valueecho"doublingthevalue"return$[$value*2]}db1echo"新的值是$?"17.2.3useFunctionoutput可以将函数的输出保存到变量中,写test5b.sh脚本#!/bin/bashfunctiondb1{read-p"Enteravalue:"valueecho$[$value*2]}result=$(db1)ech??o"Thenewvalueis$result"17.3在函数中使用变量17.3.1向函数传递参数函数可以使用标准参数环境变量来表示从上传到函数的参数命令行。例如函数名会定义在$0变量中,函数命令行上的任何参数都会定义为$1、$2等,也可以使用特殊变量$#来确定传递给的参数个数功能。在脚本中指定函数时,参数和函数必须放在同一行编写test6.sh脚本#!/bin/bashfunctionaddem{if[$#-eq0]||[$#-gt2]thenecho-1elif[$#-eq1]thenecho$[$1+$1]elseecho$[$1+$2]fi}echo-n"Adding10and15:"value=$(addem1015)echo$valueecho-n"让我们尝试只添加一个数字:"value=$(addem10)echo$valueecho-n"现在尝试不添加任何数字:"value=$(addem)echo$valueecho-n"最后,尝试添加三个数字:"value=$(addem1015200)echo$value将传递给脚本的变量传递给函数编写test7.sh脚本#!/bin/bashfunctionfunc7{echo$[$1*$2]}if[$#-eq2]thenvalue=$(func7$1$2)echo"Theresultis$value"elseecho"Usage:test7ab"fi17.3.2函数中处理变量1.全局变量全局变量是在shell脚本中任何地方都有效的变量。如果您在脚本主体中定义了一个全局变量,您可以在函数内部读取它的值。如果在函数内定义全局变量,则可以在脚本的主题部分读取它的值。默认情况下,脚本中定义的任何变量都是全局变量,函数外定义的变量可以在函数内访问。编写test8.sh脚本#!/bin/bashfunctiondb1{value=$[$value*2]}read-p"Enteravalue:"valuedb1echo"Thenewvalueis:$value"2.局部变量不需要在函数中使用全局变量,函数内部使用的任何变量都可以声明为局部变量。只需在变量声明前添加local关键字即可。您还可以在变量赋值语句中使用local关键字。编写test9.sh脚本#!/bin/bashfunctionfunc1{localtemp=$[$value+5]result=$[$temp*2]}temp=4value=6func1echo"Theresultis$result"if[$temp-gt$value]thenecho"tempislarger"elseecho"tempissmaller"fi17.4数组变量和函数17.4.1将数组参数传递给函数将数组的值分解为单个值作为函数参数写test1.shScript#!/bin/bashfunctiontestit{localnewarraynewarray=($@)echo"新数组值为:${newarray[*]}"}myarray=(12345)echo"原数组is${myarray[*]}"test${myarray[*]}编写test11.sh脚本#!/bin/bashfunctionAddarray{localsum=0localnewarraynewarray=($(echo"$@"))forvaluein${newarray[*]}dosum=$[$sum+$value]giveecho$sum}myarray=(12345)echo"原始数组为:${myarray[*]}"arg1=$(echo${myarray[*]})result=$(addarray$arg1)ech??o"Theresultis$result"17.4.2从函数返回数组从函数返回数组变量到shell脚本编写test12.sh脚本#!/bin/bashfunctionarraydb1r{localorigarraylocalnewarray本地元素localiorigarray=($(echo"$@"))newarray=($(echo"$@"))elements=$[$#-1]for((i=0;i<=$elements;i++)){newarray[$i]=$[${origarray[$i]}*2]}echo${newarray[*]}}myarray=(12345)echo"原数组为:${myarray[*]}"arg1=$(echo${myarray[*]})result=($(arraydb1r$arg1))echo"新数组为:${result[*]}"17.5函数递归使用递归计算阶乘来写test13.sh脚本#!/bin/bashfunctionfactorial{if[$1-eq1]thenecho1elselocaltemp=$[$1-1]localresult=$(factorial$temp)echo$[$result*$1]fi}read-p"Entervalue:"valueresult=$(factorial$value)echo"$value的阶乘为:$result"17.6创建库如果多个脚本需要使用相同的代码,可以使用一个函数库文件,然后在脚本中引用库文件1.创建库文件写myfuncs文件functionaddem{echo$[$1+$2]}functionmultem{echo$[$1*$2]}functiondivem{if[$2-ne0]thenecho$[$1/$2]elseecho-1fi}2.使用这个库文件编写test14.sh脚本#!/bin/bash。./myfuncsvalue1=10value2=5result1=$(addem$value1$value2)result2=$(multem$value1$value2)result3=$(divem$value1$value2)echo"它们相加的结果是:$result1"echo"它们相乘的结果是:$result2"echo"它们相除的结果是:$result3"17.7在命令行上使用函数17.7.1在命令行上创建函数由于shell会解释用户输入的命令,所以可以直接定义一个命令行函数执行命令functiondivem{echo$[$1/$2];}divem1005警告:在命令行上创建函数时要小心如果您为函数赋予与内置命令或其他命令相同的名称,该函数将覆盖原始命令。17.7.2在.bashrc文件中定义函数1.直接定义函数可以直接在主目录下的.bashrc文件中定义函数,比如在文件末尾添加functionaddem{echo$[$1+$2]}2.读取函数文件可以使用source命令(即点运算符)将库文件中的函数添加到.bashrc脚本中,比如在末尾添加./home/zc/libraries/myfuncs17.8文件。实例函数的应用并不局限于创建自己的Functions自娱自乐。在开源世界中,共享代码是关键,脚本函数也是如此。这里将介绍如何下载、安装和使用GNUshtoolshell脚本函数库。17.8.1下载与安装下载地址:ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz解压文件:tar-zxvfshtool-2.0.8.tar.gz17.8.2Build必须为特定的Linux环境配置库shtool文件。配置工作必须使用标准的configure和make命令,这些命令通常用于C编程环境中执行命令。可以在shell脚本中使用功能:说明Arx:创建归档文件(包括一些扩展功能)Echo:显示字符串,并提供一些扩展组件fixperm:更改目录树中的文件权限install:安装脚本或文件mdate:显示修改文件或目录的时间mkdir:创建一个或多个目录Mkln:使用相对路径创建链接mkshadow:创建影子树move:具有替换功能的文件移动Path:处理程序路径platform:显示PlatformIdentificationProp:显示动画进度barrotate:Transposelogfilesscpp:SharedCpreprocessorSlo:根据库类分离链接器选项Subst:使用sed的替换操作表格显示数据以字段分隔(field-separated)tarball:从文件和目录创建tar文件version:create版本信息文件shtool函数使用格式shtool[options][function[options][args]]17.8.4use库可以直接使用shtool函数在命令行或者自己的shell脚本中编写test16.sh脚本#!/bin/bashshtoolplatform17.9总结shell脚本功能可以让脚本中使用的多段代码放在一处。您可以创建一个包含代码块的函数,然后在脚本中通过函数名引用代码,而不是一次又一次地重复该代码。