手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Bash 实例,第 2 部分

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

函数和名称空间
在 bash 中,甚至能够定义和其他过程语言(如 Pascal 和 C)类似的函数。在 bash 中,函数甚至能够使用和脚本接收命令行自变量类似的方式来接收自变量。让我们看一下样本函数定义,然后再从那里继续:




 

 tarview() {

     echo -n "Displaying contents of  "

     if [ $ = tar ]

then 

         echo "(uncompressed tar)"

         tar tvf 

     elif [ $ = gz ]

then 

         echo "(gzip-compressed tar)"

         tar tzvf 

     elif [ $ = bz2 ]

then 

         echo "(bzip2-compressed tar)"

         cat  | bzip2 -d | tar tvf -

fi

 }

另一种情况
能够使用 "case" 语句来编写上面的代码。您知道如何编写吗?

我们在上面定义了一个名为 "tarview" 的函数,他接收一个自变量,即某种类型的 tar 文档。在执行该函数时,他确定自变量是哪种 tar 文档类型(未压缩的、gzip 压缩的或 bzip2 压缩的),打印一行信息性消息,然后显示 tar 文档的内容。应该如下调用上面的函数(在输入、粘贴或找到该函数后,从脚本或命令行调用他):




 $ tarview shorten.tar.gz

 Displaying contents of shorten.tar.gz (gzip-compressed tar)

 drwxr-xr-x ajr/abbot         0 1999-02-27 16:17 shorten-2.3a/

 -rw-r--r-- ajr/abbot      1143 1997-09-04 04:06 shorten-2.3a/Makefile

 -rw-r--r-- ajr/abbot      1199 1996-02-04 12:24 shorten-2.3a/INSTALL

 -rw-r--r-- ajr/abbot       839 1996-05-29 00:19 shorten-2.3a/LICENSE

 ....  

交互地使用他们
别忘了,能够将函数(如上面的函数)放在 ~/.bashrc 或 ~/.bash_profile 中,以便在 bash 中随时使用他们。

如您所见,能够使用和引用命令行自变量同样的机制来在函数定义内部引用自变量。另外,将把 "$#" 宏扩展成包含自变量的数目。唯一可能不完全相同的是变量 "",他将扩展成字符串 "bash"(假如从 shell 交互运行函数)或调用函数的脚本名称。

名称空间
经常需要在函数中创建环境变量。虽然有可能,但是更有一个技术细节应该了解。在大多数编译语言(如 C)中,当在函数内部创建变量时,变量被放置在单独的局部名称空间中。因此,假如在 C 中定义一个名为 myfunction 的函数,并在该函数中定义一个名为 "x" 的自变量,则任何名为 "x" 的全局变量(函数之外的变量)将不受他的印象,从而消除了负作用。

在 C 中是这样,但在 bash 中却不是。在 bash 中,每当在函数内部创建环境变量,就将其添加到 全局名称空间。这意味着,该变量将重写函数之外的全局变量,并在函数退出之后继续存在:




 #!/usr/bin/env bash

 

 myvar="hello"

 

 myfunc() {

 

     myvar="one two three"

     for x in $myvar

     do

         echo $x

     done

 }

 

 myfunc

 

 echo $myvar $x

运行此脚本时,他将输出 "one two three three",这显示了在函数中定义的 "$myvar" 如何影响全局变量 "$myvar",连同循环控制变量 "$x" 如何在函数退出之后继续存在(假如 "$x" 全局变量存在,也将受到影响)。

在这个简单的例子中,很容易找到该错误,并通过使用其他变量名来改正错误。但这不是正确的方法,解决此问题的最好方法是通过使用 "local" 命令,在一开始就预防影响全局变量的可能性。当使用 "local" 在函数内部创建变量时,将把他们放在 局部名称空间中,并且不会影响任何全局变量。这里演示了如何实现上述代码,以便不重写全局变量:




 

 #!/usr/bin/env bash

 

 myvar="hello"

 

 myfunc() {

     local x

     local myvar="one two three"

     for x in $myvar

     do

         echo $x

     done

 }

 

 myfunc

 

 echo $myvar $x

此函数将输出 "hello" -- 不重写全局变量 "$myvar","$x" 在 myfunc 之外不继续存在。在函数的第一行,我们创建了以后要使用的局部变量 x,而在第二个例子 (local myvar="one two three"") 中,我们创建了局部变量 myvar, 同时 为其赋值。在将循环控制变量定义为局部变量时,使用第一种形式很方便,因为不允许说:"for local x in $myvar"。此函数不影响任何全局变量,鼓励您用这种方式设计任何的函数。只有在明确希望要修改全局变量时,才

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!