Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18690831
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类:

2008-03-21 16:39:20

先说一下,为何要用( ){ }好了。
许多时候,我们在操作上,需要在一定条件下一次执行多个命令,也就是说,要么不执行,要么就全执行,而不是每次依序的判断是否要执行下一个命令。或是,需要从一些命令执行优先次顺中得到豁免,如算术的2*(3+4)那样...
这时候,我们就可引入"命令群组"(command group)的概念:将多个命令集中处理。

shell command line中,一般人或许不太计较( ){ }这两对符号的差异,虽然两者都可将多个命令作群组化处理,但若从技术细节上,却是很不一样的:
( )command group置于sub-shell去执行,也称nested sub-shell
{ }
则是在同一个shell内完成,也称为non-named command group
如果你对上一章的forksource的概念还记得的话,那就不难理解两者的差异了。


要是在command group中扯上变量及其它环境的修改,我们可以根据不同的需求来使用( ){ }。通常而言,若所作的修改是临时的,且不想影响原有或以后的设定,那我们就nested sub-shell,反之,则用non-named command group

是的,光从command line来看,( ){ }的差别就讲完了,够轻松吧~~~  ^_^


然而,若这两个meta用在其它command meta或领域中(Regular Expression),还是有很多差别的。只是,我不打算再去说明了,留给读者自己慢慢发掘好了...


我这里只想补充一个概念,就是function
所谓的function,就是用一个名字去命名一个  command group,然后再调用这个名字去执行command group。从non-named command group来推断,大概你也可以猜到我要说的是{ }了吧?


bash中,function的定义方式有两种:
方式一:

function function_name {
  command1
  command2
  command3
  ....
}

方式二:

fuction_name () {
  command1
  command2
  command3
  ....
}

用哪一种方式无所谓,只是若碰到所定义的名称与现有的命令或别名(Alias)冲突的话,方式二或许会失败。
但方式二起码可以少打function这一串英文字母,对懒人来说(如我),又何乐不为呢?...  ^_^

function
在某一程度来说,也可称为"函式",但请不要与传统编程所使用的函式(library)搞混了,毕竟两者差异很大。
惟一相同的是,我们都可以随时用"已定义的名称"来调用它们...


若我们在shell操作中,需要不断的重复执行某些命令,我们首先想到的,或许是将命令写成命令稿(shell script)。不过,我们也可以写成function,然后在command line中打上function_name就可当一舨的script来使用了。只是若你在shell中定义的function,除了可用unset function_name取消外,一旦退出shellfunction也跟着取消。
然而,在script中使用function却有许多好处,除了可以提高整体script的执行效能外(因为已被加载),还可以节省许多重复的代码...

简单而言,若你会将多个命令写成script以供调用的话,那,你可以将function看成是script中的script ...  ^_^
而且,透过上一章介绍的source命令,我们可以自行定义许许多多好用的function,再集中写在特定文件中,然后,在其它的script中用source将它们加载并反复执行。
若你是RedHat Linux的使用者,或许,已经猜得出/etc/rc.d/init.d/functions这个文件是作啥用的了~~~  ^_^

阅读(647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~