一、命令组
许多时候,我们在shell操作上,需要在一定条件下一次执行多个命令,也就是说,要么不执行,要么就全执行,而不是每次依序的判断是否要执行下一个命令。或是,需要从一些命令执行优先次顺中得到豁免,如算术的 2*(3+4) 那样...这时候,我们就可引入"命令组"(command group)的概念:将多个命令集中处理。
在命令行中,有两个meta可以将多个命令集中处理,它们是()和{},但是在技术细节上却有很大差别:
():将命令组置于子shell去执行,也称 nested sub-shell,相当于用fork方式去执行命令组;
{}:在同一个shell内执行,也称为non-named command group,相当于用source方式去执行命令组。
二、函数
(1) 所谓的函数,就是用一个名字去命名一个命令组,然后再调用这个名字去执行命令组,其实就是相当于给non-named command group加上了一个可以调用的名字。
(2) 在bash中,函数的定义方式有两种:
方式一:
function function_name {
command1
command2
command3
....
}
方式二:
fuction_name () {
command1
command2
command3
....
}
三、取消函数
unset function_name
四、脚本中的脚本
若我们在shell 操作中,需要不断的重复质行某些命令,我们首先想到的,或许是将命令写成脚本。不过,我们也可以写成函数,然后在命令行中打上function_name就可当一般的脚本来使用了。只是若你在shell中定义的函数 ,除了可用 unset function_name 取消外,一旦退出shell,函数也跟着取消。
然而,在 script 中使用 function 却有许多好处,除了可以提高整体 script 的执行效能外(因为已被加载),还可以节省许多重复的代码。
简单而言,若你会将多个命令写成脚本以供调用的话,那你可以将函数看成是脚本中的脚本。
一般来说,我们可以自行定义许许多多好用的脚本,再集中写在特定文件中,然后,在其它的脚本中用source将它们加载并反复执行。
RedHat Linux 中的/etc/rc.d/init.d/functions 文件就是这样的作用。
五、参考
1. 《shell十三问》
(完)