版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LINUX的编程常识
武汉大学计算机学院李文海
shell函数在shell中可以定义函数。函数实际上也是由若干条shell命令组成的,因此它与shell程序形式上是相似的,不同的是它不是一个单独的进程,而是shell程序的一部分。函数由两部分组成:函数名和函数体。函数定义的格式为:函数名()
{
命令集合
}或者
function函数名()
{
命令集合
}Shell函数与脚本的区别Shell函数和shell程序比较相似,它们的区别在于:Shell程序在子Shell中运行而Shell函数在当前Shell中运行。因此在当前Shell中可以看到Shell函数对变量的修改。函数的定义和使用:可将函数放在脚本文件中作为它的一部分;可放在只包含函数的单独文件中;可在交互式环境下定义函数。在交互式环境下定义和使用函数例如:
$dir(){>ls
-l>}$定义该函数后,若在$后面键入dir,其显示结果同ls
-l的作用相同。
$dir该dir函数将一直保留到用户从系统退出,或执行了如下所示的unset命令:
$unset
dir
在脚本中定义及使用函数函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至shell首次发现它后才能使用。调用函数仅使用其函数名即可。例如:$catfunc1#!/bin/sh#func1hello(){echo"Hellotheretoday'sdateis`date`"}echo"nowgoingtothefunctionhello"helloecho"backfromthefunction"在脚本中定义及使用函数运行脚本,结果为:$func1nowgoingtothefunctionhelloHellotheretoday'sdateisSunJun610:46:59GMT2006backfromthefunction上例中函数定义于脚本顶部。可以在脚本中使用函数名hello调用它。函数执行后,控制返回函数调用的下一条语句,即语句echo“backfromthefunction”向函数传递参数向函数传递参数就像在脚本中使用位置变量$1,$2,$3...$9向脚本传递参数一样。函数返回有以下情况:函数正常执行到函数末尾,然后返回脚本中调用函数的部分。使用return返回脚本中函数调用的下一条语句,可以带返回值。0为无错误,1为有错误。其格式为:
return从函数中返回,用最后状态命令决定返回值。
return0无错误返回。
return1有错误返回向函数传递参数例#!/bin/bash#hellofunfunction
check_dir(){
if[-d$1]thenreturn0elsereturn1}函数返回值测试例check_dir$FILENAME#afunctioncallandcheckif[$?=0]#usethelaststatuscommandnowtotestthenecho"AllisOK"elseecho"Somethingwentwrong!"fi最好在if语句里使用函数调用,以增加可读性。
ifcheck_dir$FILENAME;thenecho"AllisOK"elseecho"Somethingwentwrong!"fi在shell中使用函数可以将经常使用的函数存入函数文件,然后将函数文件载入shell。文件名可任意选取,但最好与相关任务有某种联系。例如:functions.main一旦函数文件载入shell,就可以在命令行或脚本中调用函数。可以使用set命令查看所有定义的函数,其输出列表包括已经载入shell的所有函数。若要改动函数,首先用unset命令从shell中删除函数。改动完毕后,再重新载入此文件。在shell中使用函数——创建函数文件下面创建包容函数的文件并将之载入shell,进行测试,再做改动,之后再重新载入。函数文件名为functions.main,内容如下:$pgfunctions.main#!/bin/sh#functions.mainfindit(){if[$#-lt1];thenecho"Usage:finditfile"return1fifind/-name$1–print}在shell中使用函数——载入函数定位文件格式为:
.filename#注意这里的文件名要带正确路径文件已创建好后,要将它载入shell,使用如下命令:
$.functions.main注意,此即<点><空格><文件名>,现在文件应该已载入shell。如果仍有错误,则应该仔细检查是否键入了完整路径名。在shell中使用函数——检查载入函数使用set命令检查函数是否已载入。set命令将在shell中显示所有的载入函数。$setfindit=(){if[$#-lt1];thenecho"usage:finditfile";return1fifind/-name$1-print}
…
在shell中使用函数——执行shell函数要执行函数,简单地键入函数名即可:$finditgroups/usr/bin/groups/usr/local/backups/groups.bak在shell中使用函数——删除shell函数现在对函数做一些改动。首先删除函数,使其对shell不可用。使用unset命令完成此功能,其命令格式为:
unsetfunction_name$unsetfindit如果现在键入set命令,函数将不再显示。在shell中使用函数——编辑shell函数编辑函数functions.main,加入for循环以便脚本可以从命令行中读取多个参数。改动后函数脚本如下:$pgfunctions.main#!/bin/shfindit(){#finditif[$#-lt1];thenecho"usage"finditfile"return1fiforloopdofind/-name$loop-printdone}在shell中使用函数——再次执行shell函数再次定位函数$./functions.main现在执行改动过的findit函数,输入两个参数:$finditLPSO.dOCpasswd/usr/local/accounts/LPSO.doc/etc/passwd
…
在shell中使用函数——变量输入以下脚本询问名,然后是姓。$pgfunc2#!/bin/sh#func2echo-n"Whatisyourfirstname:"readF_NAMEecho-n"Whatisyoursurname:"readS_NAME在shell中使用函数——变量输入要求输入字符必须只包含字母,利用函数实现这一点。char_name(){#tocall:char_namestring_LETTERS_ONLY=$1_LETTERS_ONLY=`echo$1|awk‘{if($0~/[^a-zA-Z]/)print“1”}’`if[“$_LETTERS_ONLY”!=“”]thenreturn1#errorselsereturn0#containsonlychars}awk命令利用一组用户提供的指令来将一组文件和用户提供的扩展正则表达式比较,一次一行。awk命令的模式搜索比grep命令的搜索更常用,且它允许用户在输入文本行上执行多个操作。awk中$0表示当前记录,~表示匹配在shell中使用函数——变量输入$pgfunc2#!/bin/shchar_name()#char_name#tocall:char_namestring#checkif$1doesindeedcontainonlycharactersa-z,A-Z{#assigntheargurmentacrosstonewvariable_LETTERS_ONLY=$1_LETFERS_ONLY=`echo$1|awk‘{if($0~/[^a-zA-Z]/)print"1"}’`if["$_LETFERS_ONLY"!=""]thenreturn1#oopserrorselsereturn0#containson]ycharsfi}name_errorO#displayanerrormessage{echo"$@containserrors,itmustcontainsonlyletters"}在shell中使用函数——变量输入while:doecho-n"Whatisyourfirstname:"readF_NAMEifchar_name$F_NAMEthenbreak#allokbreakoutelsename_error$F_NAMEfidonewhile:doecho-n"Whatisyoursurname:"readS_NAMEifchar_name$S_NAMEthenbreak#allokbreakoutelsename_error$S_NAMEfidone在shell中使用函数——变量输入$func2Whatisyourfirstname:Davi2dDavi2dcontainserrors,itmustcontainonlylettersWhatisyourfirstname:DavidWhatisyoursurname:Tanslay1Tansley1containserrors,itmustcontainonlylettersWhatisyoursurname:Tanslay在shell中使用函数——测试目录存在拷贝文件时,测试目录是否存在是常见的工作之一。以下函数测试传递给函数的文件名是否是一个目录。因为此函数返回时带有成功或失败取值,可用if语句测试结果。函数如下:在shell中使用函数——测试目录存在is_it_a_directory(){#is_it_a_directory#tocall:is_it_a_directorydirectory_nameif[$#-lt1];thenecho"is_it_a_directory:Ineedanargument"return1fi#isitadirectory?_DIRECTORY_NAME=$1if[!-d$_DIRECTORY
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026宁波职业技术大学后勤服务有限责任公司招聘非编人员2人考试参考试题及答案解析
- 教育治理现代化学校治理现代化成效课题申报书
- 2026年中国高度计手表行业市场规模及投资前景预测分析报告
- 药品定价政策考试题及答案
- 2026湖南安全技术职业学院编制外人员公开招聘6人笔试备考试题及答案解析
- 2026年关于提醒员工注意夏季防溺水安全的事宜
- 2026年旅游行业大数据分析报告及创新报告
- 2026传音控股笔试真题题库及参考答案
- 2025年文化旅游演艺综合体项目技术创新与游客体验优化可行性研究报告
- 金融分析师对AI金融模型应用的分析能力提升研究教学研究课题报告
- 2026年北京市丰台区高三一模语文试卷(含答案详解)
- 清明假期安全教育课件
- 数字时代下哔哩哔哩数据资产价值评估的理论与实践
- 第五章-50-70年代台港诗歌、戏剧、散文课件
- 使用windchill pdmlink 10 2定位和查看信息
- 旭辉集团对事业部的授权
- 热交换器原理与设计管壳式热交换器设计
- 纯化水管道安装方案
- SB/T 10928-2012易腐食品冷藏链温度检测方法
- GB/T 14579-1993电子设备用固定电容器第17部分:分规范金属化聚丙烯膜介质交流和脉冲固定电容器
- 第3章 自由基聚合生产工艺课件
评论
0/150
提交评论