首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

8.7  函数

shell函数(tcsh没有函数)类似于shell脚本,里面存放了一系列可在后期执行的命令。然而,因为shell将函数存放在物理内存(RAM)中而不是磁盘文件中,所以,shell访问函数的速度要比访问脚本的速度快得多。shell还对函数预处理(解析),因此其启动速度也要比脚本快得多。同时,shell函数的执行和调用是在同一个shell中进行的。而对于脚本,如果定义了太多的函数,那么启动一个子shell的开销将变得不可接受。

shell函数的声明可以放在~/.bash_profile文件中,或者放在使用该函数的脚本中,又或者直接放在命令行中。可以使用内置命令unset删除函数。一旦用户注销,shell将不再保持这些函数。

 

删除变量和函数 

提示

如果某个shell变量和函数名称相同,那么可用unset删除shell变量。如果再次用相同的名字调用unset,就会删除这个函数。

声明一个shell函数的语法如下:

[function] function-name ()

{

commands

}

其中,关键字function是可选的,function-name为调用该函数使用的函数名,commands由调用该函数时将要执行的命令列表构成。commands可以是在shell脚本中包含的任意内容,包括调用其他函数。

第1个花括号({)可以放在函数名那一行。当读取函数(而不是执行函数)时,别名和变量被展开。可以在函数中使用break语句来中断函数执行。

shell函数很有用,可用来定义特殊命令的快捷方式。下面的函数在后台启动了一个名为process的进程,process显示的正常输出内容将被保存到.process.out中:

start_process() {

process > .process.out 2>&1 &

}

在下面的示例中,给出了如何创建一个简单的函数,以显示日期、一条标题和一个正在使用该系统的用户列表。这个函数运行的命令与第8.2.4节中所描述的脚本whoson相同。在这个示例中,函数是由键盘输入的。大于号(>)是shell次提示符(PS2),不需要用户输入。

$ function whoson ()

> {

date

echo "Users Currently Logged On"

who

> }

$ whoson

Sun Aug 7 15:44:58 PDT 2005

Users Currently Logged On

his      console       Aug 6 08:59 (:0)

alex     pts/4           Aug 6 09:33 (0.0)

jenny    pts/7           Aug 6 09:23 (bravo.examp1e.com)

初始化文件中的函数  如果希望whoson函数总是可用的,而不用每次登录时都要重新输入,那么可以将它的定义放在~/.bash_profile中。然后用.(dot)命令运行.bash_profile,使修改立即起效:

$ cat ~/.bash_profi1e

export TERM=vtl00

stty kill '^u'

whoson ()

{

date

echo "Users Currently Logged On"

who

}

$ . ~/.bash_profi1e

调用函数时可以指定参数。在函数内部可以通过位置参数访问这些参数。下面的示例给出了从键盘输入的arg1函数。

$ argi ( ) {

> echo "$1"

> }

$ argl first_arg

first_arg

参见第8.2.1节中的函数switch( ),这是另一个函数示例。第11.3.2节中的“函数”部分讨论了在函数内局部变量和全局变量的使用方法。

选读

下面的函数使用户可以用tcsh语法输出变量。内置命令env列出所有环境变量及其值,并验证setenv是否工作正常:

$ cat .bash_profi1e

...

# setenv - keep tcsh users happy

function setenv()

{

if [ $# -eq 2 ]

then

eval $1=$2

export $1

else

echo "Usage: setenv NAME VALUE" 1>&2

fi

}

$ . ~/.bash_profi1e

$ setenv TCL_LIBRARY /usr/local/lib/tcl

$ env | grep TCL_LIBRARY

TCL_LIBRARY=/usr/1ocal/lib/tcl

eval  $#是个特殊参数,它保存了命令行参数的个数。这个函数使用内置命令eval强制bash扫描$1=$2两次。因为$1=$2以美元符号($)开头,shell将整个串作为一个单个的字(即命令)看待。当执行变量替换之后,该命令名变成了TCL_LIBRARY=/usr/local/ lib/tcl,这将导致错误。使用eval,第2次扫描将这个串划分为3个预期的字,并进行了正确的赋值。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论