Bash Shell 实例 ——环境变量

环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如Linux中Path变量就是标示系统中一些命令(ls、cd、chmod、umount等等)文件所在的位置(/bin、usr/bin、usr/local/bin、当前目录等)。

 

在bash和几乎所有其他shell中,用户可以定义环境变量,这些环境以ASCII字符串存储。环境变量的最便利之处在于:它们是UNIX进程模型的标准部分。这意味着:环境变量不仅由shell脚本独用,而且还可以由编译过的标准程序使用。当在bash中“导出 ”环境变量时,以后运行的任何程序,不管是不是shell脚本,都可以读取设置。一个很好的例子是设置PATH环境变量,当编写了一个不错的脚本或程序的时候,可以将这个脚本或程序的目录添加到PATH中,此后就可以直接在命令行输入脚本或程序名执行它,当然要注意编写的脚本或程序的名称,避免与系统提供的重名。另一个很好的例子是vipw命令,它通常允许root用户编辑系统口令文件。通过将EDITOR环境变量设置成喜爱的文本编辑器名称,可以配置vipw,使其使用该编辑器,而不是用vi,如果习惯于xemacs而确实不喜欢vi,那么这是很便利的。

 

在bash中定义环境变量的标准方法是:

$ myvar='This is my environment variable!'

 

以上命令定义了一个名为“myvar”的环境变量,并包含字符串“This is my environment variable!”。以上有几点注意事项:第一,在等号“=”的两边没有空格,任何空格将导致错误(Shell将把任何一个空白之后的字符串当作一条命令执行;试试看,可以用命令unset取消定义)。第二个要注意的事是:虽然在定义一个字时可以省略引号,但是当定义的环境变量多于一个字时(包含空格或制表键),引号是必需的。第三,虽然通常可以用双引号来代替单引号,但在上例中,这样会导致错误。为什么呢?因为使用单引号禁用了成为扩展的bash特性(或bsh的扩展特性),其中,特殊字符和字符系列由值替换。例如,“!”字符是历史扩展符,bash通常将其替换位前面输入的命令。尽管这个类似于宏的功能很便利,但我们现在只想在环境变量后面加上一个简单的感叹号,而不是宏。也就是说,当我们只是简单的使用字符串的时候,使用单引号就可以了。

 

现在,让我们看一下如何实际使用环境变量。例:

$ echo $myvar

This is my environment variable!

 

通过在环境变量的前面加上一个$,可以使bash用myvar的值替换它。这在bash术语中叫“变量扩展”。但是,这样做将怎样:

$ echo foo$myvarbar

foo

 

我们希望回显“foo This is my environment variable!bar ”,但却不是这样。错在哪里?简单的说bash扩展变量实施的时候陷入了困惑。它无法识别要扩展哪一个变量:$m、$my、$myvar、$myvarbar等等。如何更明确地告诉bash引用哪一个变量?试一下这个:

$ echo foo${myvar}bar

fooThis is my environment variable!bar

 

如您所见,当环境变量没有与周围文本明显分开时,可以用花括号将它括起来。虽然$myvar可以更快地输入,并且在大多数情况下正确工作,但${myvar}却能在几乎所有的情况下正确通过语法分析。除此之外,二者相同。请记住:当环境变量没有用空白(空白或制表键)与周围文本分开时,请使用更明确的花括号形式。

 

回想一下,我们还提到过可以“导出”环境变量。当导出环境变量时,它可以自动地由以后运行的脚本或可执行程序环境使用。shell脚本可以使用shell的内置环境变量支持“达到”环境变量,而C程序可以使用getenv()函数调用。这里有一些C代码示例,输入并编译它们——它将帮助我们从C的角度理解环境变量:

 


myenv.c -- 样本环境变量 C 程序

#include <stdio.h>
#include <stdlib.h>

int main()
{
char *myenv = getenv("EDITOR");

printf("The editor environment variable is set to %s/n", myenv);

return 0;
}



将上面的代码保存到文件 myenv.c 中,然后发出以下命令进行编译:

$ gcc myenv.c -o myenv


现在,目录中将有一个可执行程序,它在运行时将打印 EDITOR 环境变量的值(如果有值的话)。这是在我机器上运行时的情况:

$ ./myenv
The editor environment variable is set to (null
)

 

啊... 因为没有将 EDITOR 环境变量设置成任何值,所以 C 程序得到一个空字符串。让我们试着将它设置成特定值:

 

$ EDITOR=gvim

$ ./myenv

The editor environment variable is set to (null)

 

虽然希望 myenv 打印值 "gvim",但是因为还没有导出环境变量,所以它却没有很好地工作。这次让它正确工作:


$ export EDITOR

$ ./myvar

The editor environment variable is set to gvim

 

现在,如您亲眼所见:不导出环境变量,另一个进程(在本例中是示例 C 程序)就看不到环境变量。顺便提一句,如果愿意,可以在一行定义并导出环境变量,如下所示:


$ export EDITOR=gvim

 

这与两行版本的效果相同。现在该演示如何使用 unset 来除去环境变量:


$ unset EDITOR

./myvar

The editor environment variable is set to (null)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值