#Linux #shell #开发
6.1 环境变量
bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许你在内存中存储数据,以便程序 或shell中运行的脚本能够轻松访问到它们。
环境变量分为两类:
全局变量
局部变量
6.1.1 全局环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。
系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。
env命令与printenv命令 查看全局变量,例:
$ printenv
HOSTNAME=server01.class.edu
SELINUX_ROLE_REQUESTED=
TERM=xterm SHELL=/bin/bash HISTSIZE=1000
[...]
HOME=/home/Christine
LOGNAME=Christine
[...]
G_BROKEN_FILENAMES=1 _=/usr/bin/printenv
printenv命令可以显示个别环境变量,env命令则不行,例:
$ printenv HOME
/home/Christine
$
$ env HOME
env: HOME: No such file or directory
$
echo命令也可以显示环境变量,须在变量前加 $ 符,例:
$ echo $HOME
/home/Christine
$
在变量名前加上 $ 符可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。
6.1.2 局部环境变量
局部变量则只对创建它们的shell可见。
查看局部环境变量的列表有点复杂,在Linux系统并没有一个只显示局部环境变量的命令。
set命令 会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量 以及用户定义变量。
$ set
BASH=/bin/bash
[...]
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
[...]
colors=/etc/DIR_COLORS
my_variable='Hello World'
[...]
$
可以看到,所有通过 printenv命令能看到的全局环境变量都出现在了set命令的输出中。 但在set命令的输出中还有其他一些环境变量,即局部环境变量和用户定义变量。
env、printenv和set之间的差异:
set命令会显示出全局变量、局部变量以 及用户定义变量。它还会按照字母顺序对结果进行排序。
env和printenv命令同set命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下,env和printenv的输出是重复的。不过env命令有一个printenv没有的功能, 这使得它要更有用一些。
6.2 设置用户定义变量
可以在bash shell中直接设置自己的变量。
6.2.1 设置局部用户定义变量
一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串。例:
$ my_variable=Hello
$
$ echo $my_variable
Hello
如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
$ my_variable=Hello World
-bash: World: command not found
$
$ my_variable="Hello World"
$
$ echo $my_variable
Hello World
$
所有的 环境变量名均使用 大写字母,这是bash shell的 标准惯例。如果是你自己创建的 局部变量或是 shell脚本,请使用 小写字母。 变量名区分大小写。在涉及 用户定义的局部变量时坚持使用 小写字母,这能够避免 重新定义 系统环境变量可能带来的灾难。
变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格, bash shell就会把值当成一个单独的命令:
$ my_variable = "Hello World"
-bash: my_variable: command not found
$
设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个 shell,它在子shell中就不可用。
类似地,如果你在子进程中设置了一个局部变量,那么一旦你退出了子进程,那个局部环境变量就不可用。
6.2.2 设置全局环境变量
在设定全局环境变量的进程所创建的子进程中,该变量都是可见的。创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。
export命令 将局部环境变量导出到全局环境中,变量名前面不需要加$。
$ my_variable="I am Global now"
$
$ export my_va