【Linux基础】shell函数
2013-06-11 16:24
99 查看
[align=left]直到目前为止,我们做实验所编写的shell程序都是非常短小的。可在实际应用中,有时我们为项目所编写的脚本程序是非常大型的,这时我们该如何来构造自己的代码呢。很多人可能想到说将我们大型脚本按照功能模块拆分成多个小型脚本,但这种做法存在如下几个缺点:[/align]
[align=left]1、在一个脚本程序中运行另外一个脚本程序要比执行一个函数慢得多。[/align]
[align=left]2、返回执行结果变得更加困难,而且可能存在非常多的小脚本。[/align]
[align=left]基于上面原因及拆分思想,我们可以定义并使用shell函数,其语法格式为:[/align]
[align=left][function]函数名( )[/align]
[align=left]{[/align]
[align=left]命令表(Statements)[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]语法结构分析:[/align]
[align=left]其中,关键字function可以缺省。[/align]
[align=left]通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是:[/align]
[align=left]return [ n ][/align]
[align=left]其中,n值是退出函数时的退出值(退出状态),即$?的值。当n值缺省时,则退出值是最后一个命令执[/align]
[align=left][/align]
[align=left]函数应先定义,后使用。调用函数时,直接利用函数名,如foo,不必带圆括号,就像一般命令那样使用。其最大作用就是可以简化很多代码,这在较大的shell脚本设计中可能会更加明显,如本章中的综合应用。[/align]
[align=left]实验1:利用shell函数写一个简单的显示例子[/align]
[align=left][root@localhost shell]# vi sh.sh[/align]
[align=left]#!/bin/bash[/align]
[align=left]first()[/align]
[align=left]{[/align]
echo "***********************************"
[align=left]}[/align]
[align=left]second()[/align]
[align=left]{[/align]
[align=left]echo "======================="[/align]
[align=left]}[/align]
[align=left]third()[/align]
[align=left]{[/align]
[align=left]echo "* *"[/align]
[align=left]}[/align]
[align=left]four()[/align]
[align=left]{[/align]
[align=left]echo "* hello,welcome to linux world *"[/align]
[align=left]}[/align]
[align=left]five()[/align]
[align=left]{[/align]
echo "* (http://www.gec-edu.org)
*"
[align=left]}[/align]
[align=left]second[/align]
[align=left]first[/align]
[align=left]third[/align]
[align=left]third[/align]
[align=left]four[/align]
[align=left]five[/align]
[align=left]third[/align]
[align=left]third[/align]
[align=left]first[/align]
[align=left]second[/align]
[align=left]运行这个脚本程序会显示如下的输出信息:[/align]
[align=left][root@localhost shell]# ./sh.sh[/align]
[align=left]==========================[/align]
[align=left]*****************************[/align]
[align=left]* *[/align]
[align=left]* *[/align]
[align=left]* hello,welcome to linux world *[/align]
* (http://www.gec-edu.org)
*
[align=left]* *[/align]
[align=left]* *[/align]
[align=left]*****************************[/align]
[align=left]==========================[/align]
[align=left]实验解析:[/align]
[align=left]这个脚本程序还是从自己的顶部开始执行,这一点与其他脚本程序没有什么分别。但当它遇见first()结构时,它知道定义了一个名为first的函数。它会记住foo代表一个函数并从}字符之后的位置继续执行。当执行到单独的行foo时,shell就知道应该去执行刚才定义的函数了,当这个函数执行完毕以后,执行过程会返回到调用foo函数的那条语句的后面继续执行。[/align]
[align=left]你必须在调用一个函数之前先对它进行定义,这有点像Pascal语言里函数必须先于调用而被定义的概念,只是在shell中不存在前向声明。[/align]
[align=left][/align]
[align=left]Shell脚本与函数间的参数传递可利用位置参数和变量直接传递。当一个函数被调用时,[/align]
[align=left]变量的值可以直接由Shell脚本传递给被调用的函数,而脚本程序中所用的位置参数$*、$@、$#、$1、$2等则会被替换为函数的参数。当函数执行完毕后,这些参数会恢复为它们之前的值。[/align]
[align=left][/align]
[align=left]实验2:变量作为参数被shell函数调用[/align]
[align=left][root@localhost shell]# vi sh_01.sh[/align]
[align=left]#!/bin/bash[/align]
[align=left]input_data()[/align]
[align=left]{[/align]
[align=left]echo -e "Enter your data:\c"[/align]
[align=left]read tmp[/align]
[align=left]data=${tmp%%,*}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]insert_title()[/align]
[align=left]{[/align]
[align=left]echo $* >> title_file[/align]
[align=left]return[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]input_data[/align]
[align=left]insert_title $data[/align]
[align=left]运行这个脚本程序会显示如下的输出信息:[/align]
[align=left][root@localhost shell]# ls[/align]
[align=left]sh_01.sh[/align]
[align=left][root@localhost shell]# ./sh_01.sh[/align]
[align=left]Enter your data:yang jing zhao[/align]
[align=left][root@localhost shell]# ls[/align]
[align=left]sh_01.sh title_file[/align]
[align=left][root@localhost shell]# cat title_file[/align]
[align=left]yang jing zhao[/align]
[align=left][/align]
[align=left]实验3:脚本的位置参数作为参数被shell函数调用[/align]
[align=left][root@localhost shell]# vi sh_02.sh[/align]
[align=left]#!/bin/bash[/align]
[align=left]get_sure ()[/align]
[align=left]{[/align]
[align=left]echo "Is your data: $*"[/align]
[align=left]echo -n "Enter yes or no:"[/align]
[align=left]while true[/align]
[align=left]do[/align]
[align=left]read x[/align]
[align=left]case "$x" in[/align]
[align=left]y | yes ) return 0;;[/align]
[align=left]n | no ) return 1;;[/align]
[align=left]*) echo "answer yes or no" ;;[/align]
[align=left]esac[/align]
[align=left]done[/align]
[align=left]}[/align]
[align=left][/align]
echo "shell parameters you input are
*"
[align=left]if get_sure "$*"[/align]
[align=left]then[/align]
echo "the data you enter is
*"
[align=left]else[/align]
[align=left]echo "you enter nothing"[/align]
[align=left]fi[/align]
[align=left]exit 0[/align]
[align=left]运行这个脚本程序会显示如下的输出信息:[/align]
[align=left][root@localhost shell]# ./sh_02.sh yang jing zhao[/align]
[align=left]shell parameters you input are:yang jing zhao[/align]
[align=left]Is your data: yang jing zhao[/align]
[align=left]Enter yes or no:y[/align]
[align=left]the data you enter is:yang jing zhao[/align]
[align=left][root@localhost shell]# ./sh_02.sh yang jing zhao[/align]
[align=left]shell parameters you input are:yang jing zhao[/align]
[align=left]Is your data: yang jing zhao[/align]
[align=left]Enter yes or no:n[/align]
[align=left]you enter nothing[/align]
本文转载于唯C教育,【Linux基础】shell函数
http://www.weicedu.com/forum.php?mod=viewthread&tid=95&fromuid=4
(出处: http://www.weicedu.com/)
[align=left]1、在一个脚本程序中运行另外一个脚本程序要比执行一个函数慢得多。[/align]
[align=left]2、返回执行结果变得更加困难,而且可能存在非常多的小脚本。[/align]
[align=left]基于上面原因及拆分思想,我们可以定义并使用shell函数,其语法格式为:[/align]
[align=left][function]函数名( )[/align]
[align=left]{[/align]
[align=left]命令表(Statements)[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]语法结构分析:[/align]
[align=left]其中,关键字function可以缺省。[/align]
[align=left]通常,函数中的最后一个命令执行之后,就退出被调函数。也可利用return命令立即退出函数,其语法格式是:[/align]
[align=left]return [ n ][/align]
[align=left]其中,n值是退出函数时的退出值(退出状态),即$?的值。当n值缺省时,则退出值是最后一个命令执[/align]
[align=left][/align]
[align=left]函数应先定义,后使用。调用函数时,直接利用函数名,如foo,不必带圆括号,就像一般命令那样使用。其最大作用就是可以简化很多代码,这在较大的shell脚本设计中可能会更加明显,如本章中的综合应用。[/align]
[align=left]实验1:利用shell函数写一个简单的显示例子[/align]
[align=left][root@localhost shell]# vi sh.sh[/align]
[align=left]#!/bin/bash[/align]
[align=left]first()[/align]
[align=left]{[/align]
echo "***********************************"
[align=left]}[/align]
[align=left]second()[/align]
[align=left]{[/align]
[align=left]echo "======================="[/align]
[align=left]}[/align]
[align=left]third()[/align]
[align=left]{[/align]
[align=left]echo "* *"[/align]
[align=left]}[/align]
[align=left]four()[/align]
[align=left]{[/align]
[align=left]echo "* hello,welcome to linux world *"[/align]
[align=left]}[/align]
[align=left]five()[/align]
[align=left]{[/align]
echo "* (http://www.gec-edu.org)
*"
[align=left]}[/align]
[align=left]second[/align]
[align=left]first[/align]
[align=left]third[/align]
[align=left]third[/align]
[align=left]four[/align]
[align=left]five[/align]
[align=left]third[/align]
[align=left]third[/align]
[align=left]first[/align]
[align=left]second[/align]
[align=left]运行这个脚本程序会显示如下的输出信息:[/align]
[align=left][root@localhost shell]# ./sh.sh[/align]
[align=left]==========================[/align]
[align=left]*****************************[/align]
[align=left]* *[/align]
[align=left]* *[/align]
[align=left]* hello,welcome to linux world *[/align]
* (http://www.gec-edu.org)
*
[align=left]* *[/align]
[align=left]* *[/align]
[align=left]*****************************[/align]
[align=left]==========================[/align]
[align=left]实验解析:[/align]
[align=left]这个脚本程序还是从自己的顶部开始执行,这一点与其他脚本程序没有什么分别。但当它遇见first()结构时,它知道定义了一个名为first的函数。它会记住foo代表一个函数并从}字符之后的位置继续执行。当执行到单独的行foo时,shell就知道应该去执行刚才定义的函数了,当这个函数执行完毕以后,执行过程会返回到调用foo函数的那条语句的后面继续执行。[/align]
[align=left]你必须在调用一个函数之前先对它进行定义,这有点像Pascal语言里函数必须先于调用而被定义的概念,只是在shell中不存在前向声明。[/align]
[align=left][/align]
[align=left]Shell脚本与函数间的参数传递可利用位置参数和变量直接传递。当一个函数被调用时,[/align]
[align=left]变量的值可以直接由Shell脚本传递给被调用的函数,而脚本程序中所用的位置参数$*、$@、$#、$1、$2等则会被替换为函数的参数。当函数执行完毕后,这些参数会恢复为它们之前的值。[/align]
[align=left][/align]
[align=left]实验2:变量作为参数被shell函数调用[/align]
[align=left][root@localhost shell]# vi sh_01.sh[/align]
[align=left]#!/bin/bash[/align]
[align=left]input_data()[/align]
[align=left]{[/align]
[align=left]echo -e "Enter your data:\c"[/align]
[align=left]read tmp[/align]
[align=left]data=${tmp%%,*}[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]insert_title()[/align]
[align=left]{[/align]
[align=left]echo $* >> title_file[/align]
[align=left]return[/align]
[align=left]}[/align]
[align=left][/align]
[align=left]input_data[/align]
[align=left]insert_title $data[/align]
[align=left]运行这个脚本程序会显示如下的输出信息:[/align]
[align=left][root@localhost shell]# ls[/align]
[align=left]sh_01.sh[/align]
[align=left][root@localhost shell]# ./sh_01.sh[/align]
[align=left]Enter your data:yang jing zhao[/align]
[align=left][root@localhost shell]# ls[/align]
[align=left]sh_01.sh title_file[/align]
[align=left][root@localhost shell]# cat title_file[/align]
[align=left]yang jing zhao[/align]
[align=left][/align]
[align=left]实验3:脚本的位置参数作为参数被shell函数调用[/align]
[align=left][root@localhost shell]# vi sh_02.sh[/align]
[align=left]#!/bin/bash[/align]
[align=left]get_sure ()[/align]
[align=left]{[/align]
[align=left]echo "Is your data: $*"[/align]
[align=left]echo -n "Enter yes or no:"[/align]
[align=left]while true[/align]
[align=left]do[/align]
[align=left]read x[/align]
[align=left]case "$x" in[/align]
[align=left]y | yes ) return 0;;[/align]
[align=left]n | no ) return 1;;[/align]
[align=left]*) echo "answer yes or no" ;;[/align]
[align=left]esac[/align]
[align=left]done[/align]
[align=left]}[/align]
[align=left][/align]
echo "shell parameters you input are
*"
[align=left]if get_sure "$*"[/align]
[align=left]then[/align]
echo "the data you enter is
*"
[align=left]else[/align]
[align=left]echo "you enter nothing"[/align]
[align=left]fi[/align]
[align=left]exit 0[/align]
[align=left]运行这个脚本程序会显示如下的输出信息:[/align]
[align=left][root@localhost shell]# ./sh_02.sh yang jing zhao[/align]
[align=left]shell parameters you input are:yang jing zhao[/align]
[align=left]Is your data: yang jing zhao[/align]
[align=left]Enter yes or no:y[/align]
[align=left]the data you enter is:yang jing zhao[/align]
[align=left][root@localhost shell]# ./sh_02.sh yang jing zhao[/align]
[align=left]shell parameters you input are:yang jing zhao[/align]
[align=left]Is your data: yang jing zhao[/align]
[align=left]Enter yes or no:n[/align]
[align=left]you enter nothing[/align]
本文转载于唯C教育,【Linux基础】shell函数
http://www.weicedu.com/forum.php?mod=viewthread&tid=95&fromuid=4
(出处: http://www.weicedu.com/)
相关文章推荐
- Linux基础(五) Shell函数
- linux基础学习第十二天(shell函数、数组以及yum使用及编译安装)
- linux文件系统基础
- Linux之V4L2基础编程
- 【linux基础】24、rsyslog 日志系统
- linux基础必备
- LINUX下进行C语言编程所需要的基础知识
- Linux基础知识和常用命令(三)
- Linux基础回想(1)——Linux系统概述
- linux面试基础考点
- 老男孩教育每日一题-第71天—基础命令知识:如何做一个linux版本的回收站
- Linux基础系列(三)RAID详解
- linux运维第一天: 计算机基础
- Linux下基础命令
- Linux基础知识之用户和用户组以及 Linux 权限管理
- linux-vsftp基础1-32
- Linux文件系统基础
- Linux 应用开发 - 15 个 gbd 调试基础命令
- linux基础命令-mkdir/tree/rmdir
- 06_Linux基础预科的课程大纲