先说说为什么要用( )或{ }好了。Qw8L8}:M_1很多时候,我们在那里在操作中,需要在一定条件下一次执行多个命令,即要么不执行,要么完全执行,而不是判断下一个命令是否每次都按顺序执行。或者,有必要从一些命令执行的优先顺序中获得豁免,如算术2*(3 4)那样...
此时,我们可以介绍它"命令群组"(command group)概念:集中处理多个命令。y[Jj*q9S)D1BSD爱好者乐园y"T!T5E&xgbK在shell command line一般人可能不太在意( )与{ }虽然这两个符号之间的差异可以分组处理多个命令,但如果技术细节非常不同:5X6NAgX:L1( )将command group置于sub-shell去执行,也叫nested sub-shell。BSD爱好者乐园dHe!h,N{ }同一个shell内部完成,又称non-named command group。BSD爱好者乐园h?i|L}?p-EL假如你对上一章fork与source如果你还记得概念,就不难理解两者的区别。
1oN,C&E@!yA1
BSD爱好者乐园/;V3e3`5u!~zl]要是在command group中扯上变量及其它环境的修改,我们可以根据不同的需求来使用( )或{ }。通常而言,若所作的修改是临时的,且不想影响原有或以后的设定,那我们就nested sub-shell,反之,则用non-named command group。fO Fw)u(p^1BSD爱好者乐园(?3?]Cfg4M1b0e是的,光从command line来看,( )与{ }的差别就讲完了,够轻松吧~~~ ^_^BSD爱好者乐园0/[O{@e7oF)eg
BSD爱好者乐园m1[)b,]4N%Z$eR然而,若这两个meta用在其它command meta或领域中(如Regular Expression),还是有很多差别的。只是,我不打算再去说明了,留给读者自己慢慢发掘好了...BSD爱好者乐园N e ICs8V)F
+d"oL;IG5_ Xs�~1我这里只想补充一个概念,就是function。BSD爱好者乐园0/(Sb ?/W所谓的function,就是用一个名字去命名一个 command group,然后再调用这个名字去执行command group。从non-named command group来推断,大概你也可以猜到我要说的是{ }了吧?
K4mg5T%^#Q r1
kl:r c�h!Fnw1在bash中,function的定义方式有两种:,~6Y8h rL1方式一:BSD爱好者乐园S%b,h.fuM
function function_name { w$V z p9N3f^(kC#^1 command18[zf"E.p9q"u&Wxs1 command28VC(?(?'A1 command3Nspy*ZR1 ....GFt2|q$M@ U1}
T;x5j^2o w1方式二:
V,w)L Y|-Prwt1
fuction_name () { %?&We L*{,P7}1 command1BSD爱好者乐园'q0AxdNu command2L ]Kw8R[fl$/1 command3#p}c*K cLZ1 ....BSD爱好者乐园3Q$t)[Xq+^.I}
Q4crp:BnAo!b1用哪一种方式无所谓,只是若碰到所定义的名称与现有的命令或别名(Alias)冲突的话,方式二或许会失败。BZY7q7Tt1但方式二起码可以少打function这一串英文字母,对懒人来说(如我),又何乐不为呢?... ^_^BSD爱好者乐园?9C,cW$h,Zk~c%a/S~'j�Y1function在某一程度来说,也可称为"函式",但请不要与传统编程所使用的函式(library)搞混了,毕竟两者差异很大。0Cc6L3~/~$kH;D1惟一相同的是,我们都可以随时用"已定义的名称"来调用它们...
)^8Pb FP8X1
%/D(aH'gsb1若我们在shell操作中,需要不断的重复执行某些命令,我们首先想到的,或许是将命令写成命令稿(shell script)。不过,我们也可以写成function,然后在command line中打上function_name就可当一舨的script来使用了。只是若你在shell中定义的function,除了可用unset function_name取消外,一旦退出shell,function也跟着取消。BSD爱好者乐园w{3jAd _然而,在script中使用function却有许多好处,除了可以提高整体script的执行效能外(因为已被加载),还可以节省许多重复的代码...BSD爱好者乐园 g%U U,D.qtBSD爱好者乐园]^/FmN~8j!V简单而言,若你会将多个命令写成script以供调用的话,那,你可以将function看成是script中的script ... ^_^BSD爱好者乐园5lk)PFXx/@而且,透过上一章介绍的source命令,我们可以自行定义许许多多好用的function,再集中写在特定文件中,然后,在其它的script中用source将它们加载并反复执行。L7k~ k'w(RJg {1若你是RedHat Linux的使用者,或许,已经猜得出/etc/rc.d/init.d/functions这个文件是作啥用的了~~~ ^_^