转:两篇 bash笔记--变量(2)

bash基础学习--环境变量

2009-03-01 18:52
bash基础学习--环境变量
----------------------
/*********************************************************
* 很想抽出一大块时间整理一下自己学习Linux的一些笔记。但是发现找到一段可观的空闲时间真
* 是很少。
* 可行的方法还是零敲碎打的记录一些小的段子,忘记的时候翻翻或许能让学过的东西在自己的
* 口袋里待的更久一些。
* 另外我发现log写的太长,真的连自己都懒的看,所以尽量都写成小的专题吧。
***********************************************************
* 这个系列用来统计所有和bash(Bourne-Again Shell)有关的东西。
* bash的概念就不介绍了,在 http://zh.wikipedia.org/wiki/Bash 可以找到关于bash的中文简介。
***********************************************************/

#1.什么是环境变量?
 
在 bash 和几乎所有其它 shell 中,用户可以定义环境变量,这些环境变量在以 ASCII 字符串存储。环境变量的最便利之处在于:它们是 UNIX 进程模型的标准部分。这意味着:环境变量不仅由 shell 脚本独用,而且还可以由编译过的标准程序(比如你编写个应用程序中)使用。当在 bash 中“export”(导出)环境变量时,以后运行的任何程序,不管是不是 shell 脚本,都可以读取设置。一个很好的例子是 vipw 命令,它通常允许 root 用户编辑系统口令文件。通过将 EDITOR 环境变量设置成喜爱的文本编辑器名称,可以配置 vipw,使其使用该编辑器,而不使用 vi,如果习惯于 xemacs 而确实不喜欢 vi,那么这是很便利的。
 
#2.在bash中定义环境变量
 
要在bash中定义一个环境变量你需要在你的bash中输入如下格式的命令

---------------bash------------------
$ myvar='This is my environment variable!'
-----------------------------------

这里我们定义了一个名为myvar的环境变量,他的值为字符串“This is my environment variable!”。这里有几个需要注意的地方:
1.在等号 "=" 的两边没有空格,任何空格将导致错误(试一下看看)。
2.虽然在定义一个字时可以省略引号,但是当定义的环境变量值多于一个字时(包含空格或制表键),引号是必须的。
3. 虽然通常可以用双引号来替代单引号,但在本例中,这样做会导致错误。为什么呢?因为使用单引号禁用了称为扩展的 bash 特性,其中,特殊字符和字符系列由值替换。例如,"!" 字符是历史扩展字符,bash 通常将其替换为前面输入的命令。尽管这个类似于宏的功能很便利,但我们现在只想在环境变量后面加上一个简单的感叹号,而不是宏。
 
Notice : 这里我不准备讨论历史扩展,因为它在 bash 编程中不常用。有关历史扩展的详细信息,请参阅 bash 帮助页中的“历史扩展”一节。可以通过在man bash中的Special Parameter下找到。
 
#3.如何使用bash中定义好的环境变量
 
对于刚才我们定义好的一个环境变量,我们要使用他,可以有如下这么一个小例子:

---------------bash------------------
$ echo $myvar
This is my environment variable
-----------------------------------

这里我们调用命令echo来显示定义好的环境变量myvar的值,这里可以看到,通过在环境变量的前面加上一个 $,可以使 bash 用 myvar 的值替换它。这在 bash 术语中叫做“变量扩展”。可如上例这么写,有时会出一些小问题。就像下面这个例子那样:

---------------bash------------------
$ echo This$myvarbar
This
-----------------------------------
可以看到,我们希望能像上一个例子中做的一样,bash将$myvar用他的值来替换,回显“ThisThis is my environment variable!bar”,可实际并没有发生。错在哪里?简单地说,bash 变量扩展设施陷入了困惑。它无法识别要扩展哪一个变量:$m、$my、$myvar 、$myvarbar 等等。如何更明确清楚地告述 bash 引用哪一个变量?试一下这个:

---------------bash------------------
$ echo This${myvar}bar
ThisThis is my enviroment variable!bar
-----------------------------------
如您所见,当环境变量没有与周围文本明显分开时,可以用花括号将它括起。虽然 $myvar 可以更快输入,并且在大多数情况下正确工作,但 ${myvar} 却能在几乎所有情况下正确通过语法分析。除此之外,二者相同,将在本系列的余下部分看到变量扩展的两种形式。请记住:当环境变量没有用空白(空格或制表 键)与周围文本分开时,请使用更明确的花括号形式。
 
#4.关于export (输出到 全局环境 中去 )
 
回想一下,我们在刚开始的地方还提到过可以“export”(导出)变量。当导出环境变量时,它可以自动地由以后运行的任何脚本或可执行程序环 境使用。shell 脚本可以使用 shell 的内置环境变量支持“到达”环境变量,而 C 程序可以使用 getenv() 函数调用。这里有一些 C 代码示例,输入并编译它们 -- 它将帮助我们从 C 的角度理解环境变量:
-----------------------------------
#include <stdio.h>
#include <stdlib.h>
int main(void) {
  char *myenvvar=getenv("EDITOR");
  printf("The editor environment variable is set to %s/n",myenvvar);
}
-----------------------------------
将上面的代码保存到文件 myenv.c 中,然后发出以下命令进行编译:
---------------bash------------------
$ gcc myenv.c -o myenv
-----------------------------------
现在,目录中将有一个可执行程序,它在运行时将打印 EDITOR 环境变量的值(如果有值的话)。这是在我机器上运行时的情况:
---------------bash------------------
$ ./myenv
The editor environment variable is set to (null)
-----------------------------------
Oops... 因为没有将 EDITOR 环境变量设置成任何值,所以 C 程序得到一个空字符串。让我们试着将它设置成特定值:
---------------bash------------------
$ EDITOR=xemacs
$ ./myenv
The editor environment variable is set to (null)
-----------------------------------
虽然希望 myenv 打印值 "xemacs",但是因为当前的环境变量设置仅存在于当前的bash进程(可以这时再打开一个bash,敲入echo $EDITOR,看看返回的结果),还没有导出环境变量,所以它却没有很好地工作。这次让它正确工作:
---------------bash------------------
$ export EDITOR
$ ./myenv
The editor environment variable is set to xemacs
-----------------------------------
现在,如您亲眼所见: 不导出环境变量,另一个进程(在本例中是示例 C 程序)就看不到环境变量。 顺便提一句,如果愿意,可以在一行定义并导出环境变量,如下所示:
---------------bash------------------
$ export EDITOR=xemacs
-----------------------------------
这与两行版本的效果相同。( 即:1.先定义变量(赋值)再 export 。2. export和变量定义在 一个语句 。 )
 
#5.如何去除已有的环境变量
 
现在该演示如何使用 unset 来除去环境变量:
---------------bash------------------
$ unset EDITOR
$ ./myenv
The editor environment variable is set to (null)
-----------------------------------
 转载 于 : http://www.talentdigger.cn/home/space.php?uid=97&do=blog&id=573

你可能感兴趣的:(shell,脚本,null,bash,扩展,文本编辑)