可以在bash shell中直接设置自己的变量。本节将介绍怎样在交互式shell或shell脚本程序中创
建自己的变量并引用它们。
6.2.1 设置局部用户定义变量
一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变
量了。可以通过等号给环境变量赋值,值可以是数值或字符串。
$ echo $my_variable
$ my_variable=Hello
$
$ echo $my_variable
Hello
非常简单!现在每次引用my_variable 环境变量的值,只要通过$my_variable引用即可。
如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
$ my_variable=Hello World
-bash: World: command not found
$
$ my_variable=”Hello World”
$
$ echo $my_variable
Hello World
$
没有单引号的话,bash shell会以为下一个词是另一个要执行的命令。注意,你定义的局部环
境变量用的是小写字母,而到目前为止你所看到的系统环境变量都是大写字母。
窍门 所有的环境变量名均使用大写字母,这是bash shell的标准惯例。如果是你自己创建的局
部变量或是shell脚本,请使用小写字母。变量名区分大小写。在涉及用户定义的局部变量
时坚持使用小写字母,这能够避免重新定义系统环境变量可能带来的灾难。
记住,变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,
bash shell就会把值当成一个单独的命令:
$ my_variable = “Hello World”
-bash: my_variable: command not found
$
设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个
shell,它在子shell中就不可用。
$ my_variable=”Hello World”
$
$ bash
$
$ echo $my_variable
$ exit
exit
$
$ echo $my_variable
Hello World
$
在这个例子中生成了一个子shell。在子shell中无法使用用户定义变量my_variable。通过命
令echo $my_variable所返回的空行就能够证明这一点。当你退出子shell并回到原来的shell时,
这个局部环境变量依然可用。
类似地,如果你在子进程中设置了一个局部变量,那么一旦你退出了子进程,那个局部环境
变量就不可用。
$ echo $my_child_variable
$ bash
$
$ my_child_variable=”Hello Little World”
$
$ echo $my_child_variable
Hello Little World
$
$ exit
exit
$
$ echo $my_child_variable
$
当我们回到父shell时,子shell中设置的局部变量就不存在了。可以通过将局部的用户定义变
量变成全局变量来改变这种情况。
6.2.2 设置全局环境变量
在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方
法是先创建一个局部环境变量,然后再把它导出到全局环境中。
这个过程通过export命令来完成,变量名前面不需要加$。
$ my_variable=”I am Global now”
$
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash$
$ echo $my_variable
I am Global now
$
$ exit
exit
$
$ echo $my_variable
I am Global now
$
在定义并导出局部环境变量my_variable后,bash命令启动了一个子shell。在这个子shell
中能够正确的显示出变量my_variable的值。该变量能够保留住它的值是因为export命令使其
变成了全局环境变量。
修改子shell中全局环境变量并不会影响到父shell中该变量的值。
$ my_variable=”I am Global now”
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ my_variable=”Null”
$
$ echo $my_variable
Null
$
$ exit
exit
$
$ echo $my_variable
I am Global now
$
在定义并导出变量my_variable后,bash命令启动了一个子shell。在这个子shell中能够正
确显示出全局环境变量my_variable的值。子shell随后改变了这个变量的值。但是这种改变仅在子shell中有效,并不会被反映到父shell中。
子shell甚至无法使用export命令改变父shell中全局环境变量的值。
$ my_variable=”I am Global now”
$ export my_variable
$
$ echo $my_variable
I am Global now
$
$ bash
$
$ echo $my_variable
I am Global now
$
$ my_variable=”Null”
$
$ export my_variable
$
$ echo $my_variable
Null
$
$ exit
exit
$
$ echo $my_variable
I am Global now
$
尽管子shell重新定义并导出了变量my_variable,但父shell中的my_variable变量依然保
留着原先的值。