(Gentoo)Bash示例,第一部分
Bash示例,第一部分
内容:
1. Bourne again shell(bash)基础编程
简介
你可能会奇怪为什么你应该学习Bash编程。那么,这里有两个令人信服的理由: 你已经开始运行它了
如果检查一下,你可能将会发现你现在正在运行bash。即使你改变了你默认的shell,bash也可能仍在你系统的某个地方运行,因为它是标准的 Linux shell并被用做多种用途。由于bash已经运行,你运行的任何附加的bash脚本拥有固有的内存高效性,这是因为它们和任何已经运行的bash进程共 享内存。如果你已经运行了些东西来做这项工作,并且做的很好,那还为什么要载入一个500K的解释器呢?
你正在使用它
不仅是因为你已经运行了bash,另外你还在每天的基本工作中与bash进行交互。它就在那里,所以学习如何最大限度的使用它就变得很有意义。这么做将是 你的bash之旅更加有意思和具有创制性。但是为什么你应该学习bash编程呢?很简单,因为你已经在思考运行命令,复制粘贴文件,以及管道和重定向输 出。那你是否应该学习这种语言,以便使用和利用那些已熟悉和喜爱的强大省时的概念呢?命令shell开启了UNIX系统的潜能,而bash就是Linux shell。它是你和机器之间的高等级的纽带。随着你的bash知识的增长,同时你将能自动的增加你在Linux和UNIX下的生产力──就是这么简单。
Bash的困惑
通过错误的方法学习bash会是一个非常困惑的过程。很多新手敲入man bash来查看bash的man页,但令人头疼的是只面临一些shell函数特别简明和科技性的解释。其他人通过敲入info bash(来查看GNU的信息文档),但可能是man页的翻版,也可能(如果他们幸运的话)仅是一些稍微友好的信息文档出现。
(Gentoo)Bash示例,第一部分
然而这些对于初学者来说在一定程度上是令人沮丧的,标准的bash文档不可能是适合于每一个人的所有东西和迎合所有已经对一般的shell编程十分熟悉的人。毋庸置疑的,在man页上有很多优秀的技术性的信息,但是它对于初学者来说帮助是有限的。
这是这个系列存在的原因。在它里面,我将向你展示如何有效的使用bash编程结构,以便你能够编写你自己的脚本。与科技性的说明不同的是,我将通过易懂的 英文向你们讲解,使你不仅知道这是什么,而且知道你应该在什么时候有效的使用它。到这个三部分的系列之后,你将能够编写你自己的精巧的bash脚本,并能 够达到一个能够很舒服的使用bash和通过读(和理解)标准的bash文档来增进你的知识的层次上。那就让我们开始吧!
环境变量
在bash和几乎所有其他shell下,用户可以定义环境变量,它们被以ASCII字符的形式存储在内部。环境变量最有用的地方在于它们是UNIX作业模 型中的一个标准部分。这意味着环境变量并非是shell脚本所独有,而是同样可以为标准的编译程序所使用。当我们在bash下"export"一个环境变 量,任何之后我们运行的程序都可以读取我们的设定,而不管它是否是不是一个shell脚本。一个很好的例子是vipw命令,它通常允许root去编辑系统密码文件。通过设定EDITER环境变量来命名你喜欢的文本编辑器,你可以设定vipw去使用而不是vi,特别是如果你习惯于xemacs而又实在讨厌vi。
在bash下定义一个环境变量的标准方法是: 代码 1.1: 定义环境变量
$ myvar='This is my environment variable!'
上面的命令定义了一个叫"myvar"的环境变量并包含"This is my environment variable!"字符串。上面有很多是需要我们注意的:首先,在"="号两侧没有空格,任何空格都将导致一个错误产生(可以试一下看看)。第二要注意 的是虽然在定义一个词时我们可以省略引号,但当环境变量的值多于一个词(包含空格或制表符)时,引号却是必须的。 注意: 要想获得关于如何在bash中使用引号的更加详尽的信息,请参考bash man页中"QUOTING"一节。特殊字符序列由其它值"扩展"(替换)确实使 bash 中字符串的处理变得复杂。本系列将只讲述最常用的引用功能。
第三,当我们通常可以用双引号代替单引号,在上面的例子中这样做会导致一个错误。为什么呢?因为用单引号禁用了一个bash称为扩展的特性,其中特殊字符 和字符序列的值可以互换。比如,"!"字符是历史扩展字符,它通常由之前敲入的命令所替换。(在这个系列的文章中,我们不能讲述历史扩展,那是在我们 bash编程中不常用到它。要获得相关的更多信息,请看bash man页中的"HISTORY EXPANSION"部分。)尽管这个类似于宏的功能很便利,但我们现在只想在环境变量后面加上一个简单的感叹号,而不是宏。
(Gentoo)Bash示例,第一部分
现在让我们看一下一个人如何运用环境变量。下面是例子: 代码 1.2: 运用环境变量
$ echo $myvar
This is my environment variable!
通过在我们的环境变量前加上一个$,我们可以使bash来用myvar的值来取代它。在bash的术语中,这被成为"变量扩展"。但是,如果我们试过下面的会怎样: 代码 1.3: 首先使用变量扩展
$ echo foo$myvarbar
foo
我们希望这能echo "fooThis is my environment variable!bar",但是它却没有起作用。哪里出错了呢?简单的说,bash的变量扩展很容易让人迷惑。它不能判别我们要扩展的变量 是$m,$my,$myvar,$myvarbar等等。我们如何才能明确的清楚的告诉bash我们提到的是哪个变量呢?请试一下这个: 代码 1.4: 合适的变量扩展
$ echo foo${myvar}bar
fooThis is my environment variable!bar
你可以看到,当环境变量名没有很清晰的和周围的文本分开时,我们可以把它们放在一对括号内。然而$myvar可以很快的打出来并在大部分时候都能工 作,${myvar}在几乎所有的情况下都能正确的解析出来。除此之外,它们都做同样的事情,在以下的这个系列中这两种形式的变量扩展你将都能看到。当你 的环境变量没有和你周围的文本用空白(空格或制表符)分开时,你将希望记住使用更加复杂的带括号的形式。
还记的我们还提到过我们可以"导出"变量。当我们导出一个环境变量时,它将自动的可以在任何随后执行或可执行的脚本中使用。Shell脚本可以运用 shell的内建环境变量支持"获取"环境变量,而C程序可以运用getenv()函数来调用。这里是一些你应该敲入并编译的C代码的例子──它都可以使 我们从C的视角来理解环境变量: 代码 1.5: myvar.c──一个C程序环境变量的例子