环境变量:存储有关shell会话和工作环境的信息。环境变量允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。
在bash shell中,环境变量分为两类:
- 全局变量
- 局部变量
尽管bash shell使用一致的专有环境变量,但不同的Linux发行版经常会添加其自有的环境
变量。
1.全局环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。Linux系统在你开始bash会话时就设置了一些全局环境变量。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。
1.1查看环境变量
要查看全局变量,可以使用env或printenv命令,例如:
[root@node1 ~]# env
XDG_SESSION_ID=229128
HOSTNAME=node1
TERM=xterm
SHELL=/bin/bash
HISTSIZE=10000
[....]
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=124.126.202.78 28612 192.168.0.147 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
HISTTIMEFORMAT=%F %T root
_=/usr/bin/env
1.2显示某个变量的值
要显示个别环境变量的值,使用printenv命令,使用env命令会报错。
[root@node1 ~]# printenv HOME
/root
[root@node1 ~]# env HOME
env: HOME: No such file or directory
也可以使用echo显示变量的值。在这种情况下引用某个环境变量的时候,必须在变量前面加上一个美元符($)
[root@node1 ~]# echo $HOME
/root
在变量名前加上$可以让变量作为命令行参数。例如查看根目录/root
[root@node1 ~]# ls $HOME
a.txt c3pool get-docker.sh name.txt r.txt sort.txt uniq.txt
b.txt ejabberd-20.03-0.x86_64.rpm install.sh newsed.txt sed.txt split
[root@node1 ~]# ls /root
a.txt c3pool get-docker.sh name.txt r.txt sort.txt uniq.txt
b.txt ejabberd-20.03-0.x86_64.rpm install.sh newsed.txt sed.txt split
1.3全局变量作用域
正如前面提到的,全局环境变量可用于进程的所有子shell。例如:
[root@node1 ~]# bash
[root@node1 ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 22220 22212 0 17:31 pts/0 00:00:00 -bash
root 25026 22220 0 18:22 pts/0 00:00:00 bash
root 25052 25026 0 18:23 pts/0 00:00:00 ps -f
[root@node1 ~]# echo $HOME
/root
1.4设置全局环境变量
创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。例如:
[root@node1 ~]# my_variable='I am Global now'
[root@node1 ~]# export my_variable
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# bash
[root@node1 ~]# echo $my_variable
I am Global now
注意的是:修改子shell中全局环境变量并不会影响到父shell中该变量的值。子shell甚至无法使用export命令改变父shell中全局环境变量的值。
[root@node1 ~]# my_variable='I am Global now'
[root@node1 ~]# export my_variable
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# bash
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# my_variable='NULL'
[root@node1 ~]# echo $my_variable
NULL
[root@node1 ~]# exit
exit
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# bash
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# my_variable='NULL'
[root@node1 ~]# export my_variable
[root@node1 ~]# echo $my_variable
NULL
[root@node1 ~]# exit
exit
[root@node1 ~]# echo $my_variable
I am Global now
1.5 删除全局环境变量
删除命令为unset,例如:
[root@node1 ~]# echo $my_variable
[root@node1 ~]# my_variable='I am Global now'
[root@node1 ~]# export my_variable
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# unset my_variable
[root@node1 ~]# echo $my_variable
[root@node1 ~]#
需要注意一点的是:如果在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用。
[root@node1 ~]# my_variable='I am Global now'
[root@node1 ~]# export my_variable
[root@node1 ~]# bash
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# unset my_variable
[root@node1 ~]# echo $my_variable
[root@node1 ~]# exit
exit
[root@node1 ~]# echo $my_variable
I am Global now
2.局部环境变量
局部环境变量只能在定义它们的进程中可见事实上,Linux系统也默认定义了标准的局部环境变量,也可以定义自己的局部变量。
2.1查看命令
在Linux系统并没有一个只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户自定义变量。例如:
[root@node1 ~]# set
BASH=/usr/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
[....]
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=229128
_=/root
colors=/root/.dircolors
注意:set命令会显示出全局变量、局部变量以及用户定义变量,且还会按照字母顺序对结果进行排序。
env和printenv命令同set命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。
2.2 设置局部用户自定义变量
一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串,若赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
变量名区分大小写。按照bash shell的标准惯例,所有的环境变量名均使用大写字母,如果是你自己创建的局部变量或是shell脚本,请使用小写字母。例如:
[root@node1 ~]# echo $first_variable
[root@node1 ~]# first_variable='Hello World'
[root@node1 ~]# echo $first_variable
Hello World
设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,它在子shell中就不可用,相同的,在子shell设置的局部环境变量,父shell也不可用。例如:
[root@node1 ~]# echo $first_variable
[root@node1 ~]# first_variable='Hello World'
[root@node1 ~]# echo $first_variable
Hello World
[root@node1 ~]# bash
[root@node1 ~]# echo $first_variable
[root@node1 ~]# echo $child_variable
[root@node1 ~]# child_variable='Hello World'
[root@node1 ~]# echo $child_variable
Hello World
[root@node1 ~]# exit
exit
[root@node1 ~]# echo $child_variable
[root@node1 ~]#
2.3 删除局部用户自定义变量
与删除全局环境变量一样,使用unset命令
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# unset my_variable
[root@node1 ~]# echo $my_variable
[root@node1 ~]#
在上面变量的介绍中,涉及环境变量名时,什么时候该使用$,什么时候不该使用$,大家估计存在疑惑。使用的窍门是:如果要用到变量,使用$;如果要操作变量,不使用$。这条规则的一个例外就是使用printenv显示某个变量的值。
本文详细介绍了Linux环境变量的管理,包括查看全局和局部环境变量,设置新的环境变量,以及如何删除这些变量。通过`env`、`printenv`、`set`命令查看环境变量,使用`export`导出为全局变量,使用`unset`删除变量。此外,还强调了全局变量在子shell中的作用域和局部变量的生命周期。

被折叠的 条评论
为什么被折叠?



