shell_3.linux环境变量

1.全局环境
可以使用 env 命令或 printenv 命令来查看全局变量:

$ printenv


要显示个别环境变量的值

$ printenv HOME


也可以使用 echo 命令显示变量的值。
符号($):

$ echo $HOME

局部环境变量
局部环境变量只能在定义它的进程中可见
set 命令可以显示特定进程的所有环境变量


2.设置用户自定义变量
设置局部用户自定义变量
可以使用等号为变量赋值,值可以是数值或字符串

$ my_variable=Hello
$ echo $my_variable

如果用于赋值的字符串包含空格,则必须用单引号或双引号来界定该字符串的起止:

$ my_variable="Hello World"
$ echo $my_variable

在变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格,那么 bash shell 会将值视为单独的命令:

$ my_variable = "Hello World"

设置好局部变量后,就能在 shell 进程中随意使用了。
但如果又生成了另一个 shell,则该变量在子 shell 中不可用:
如果在子进程中设置了一个局部变量,那么一旦退出子进程,该局部变量就不能用了

$my_variable="Hello World"
$ 
$ bash
$ echo $my_variable 
$ exit
$ echo $my_variable


3.设置全局环境变量
可以通过 export 命令以及要导出的变量名(不加$符号)来实现:

$ my_variable="I am Global now"
$ 
$ export my_variable
$ 
$ echo $my_variable

修改子 shell 中的全局环境变量并不会影响父 shell 中该变量的值,
子shell 无法使用 export 命令改变父 shell 中全局环境变量的值

$ export my_variable="I am Global now"
$ echo $my_variable
I am Global now 
$ 
$ bash
$ echo $my_variable
I am Global now 
$ my_variable="Null"
$ echo $my_variable
Null 
$ exit
 echo $my_variable 
I am Global now 
$


4.删除环境变量
可以用 unset 命令来完成删除操作

$ my_variable="I am going to be removed"
$ echo $my_variable
I am going to be removed 
$ 
$ unset my_variable
$ echo $my_variable

如果是在子进程中删除了一个全局环境变量,那么该操作仅对子进程有效。该全局环境变量在父进程中依然可用

5.默认的 shell 环境变量
在默认情况下,bash shell 会用一些特定的环境变量来定义系统环境。
bash shell 支持的 Bourne 变量

CDPATH           以冒号分隔的目录列表,作为 cd 命令的搜索路径
HOME             当前用户的主目录
IFS              shell 用来将文本字符串分割成字段的若干字符
MAIL             当前用户收件箱的文件名(bash shell 会检查这个文件来确认有没有新邮件)
MAILPATH         以冒号分隔的当前用户收件箱的文件名列表(bash shell 会检查列表中的每个文件来确认有没有新邮件)
OPTARG           由 getopt 命令处理的最后一个选项参数
OPTIND           由 getopt 命令处理的最后一个选项参数的索引
PATH             shell 查找命令时使用的目录列表,以冒号分隔
PS1              shell 命令行的主提示符
PS2              shell 命令行的次提示符

bash shell 环境变量

BASH                     bash shell 当前实例的完整路径名
BASH_ALIASES             关联数组,包含当前已设置的别名
BASH_ARGC                数组变量,包含传入函数或 shell 脚本的参数个数
BASH_ARCV                数组变量,包含传入函数或 shell 脚本的参数
BASH_ARCV0               包含 shell 的名称或 shell 脚本的名称(如果在脚本中使用的话)
BASH_CMDS                关联数组,包含 shell 已执行过的命令的位置
BASH_COMMAND             正在执行或将要执行的 shell 命令
BASH_COMPAT              指定 shell 兼容级别的值
BASH_ENV                 如果设置的话,bash 脚本会在运行前先尝试运行该变量定义的启动文件
BASH_EXECUTION_STRING    使用 bash 命令的-c 选项传递过来的命令
BASH_LINENO              数组变量,包含当前正在执行的 shell 函数在源文件中的行号
BASH_LOADABLE_PATH       以冒号分隔的目录列表,shell 会在其中查找可动态装载的内建命令
BASH_REMATCH             只读数组变量,在使用正则表达式的比较运算符=~进行肯定匹配(positive match)时,包含整个模式及子模式所匹配到的内容
BASH_SOURCE              数组变量,包含当前正在执行的 shell 函数所在的源文件名
BASH_SUBSHELL            当前子 shell 环境的嵌套级别(初始值是 0)
BASH_VERSINFO            数组变量,包含 bash shell 当前实例的主版本号和次版本号
BASH_VERSION             bash shell 当前实例的版本号
BASH_XTRACEFD            如果设置为有效的文件描述符(0、1、2),则'set -x'调试选项生成的跟踪输出可被重定向。通常用于将跟踪信息输出到文件中
BASHOPTS                 当前启用的 bash shell 选项
BASHPID                  当前 bash 进程的 PID 
CHILD_MAX                设置 shell 能够记住的已退出子进程状态的数量
COLUMNS                  bash shell 当前实例所用的终端显示宽度
COMP_CWORD               变量 COMP_WORDS 的索引,其中包含当前光标的位置
COMP_LINE                当前命令行
COMP_POINT               相对于当前命令起始处的光标位置索引
COMP_KEY                 用来调用 shell 函数补全功能的最后一个按键
COMP_TYPE                一个整数值,指明了用以完成 shell 函数补全所尝试的补全类型
COMP_WORDBREAKS          Readline 库中用于单词补全的分隔符
COMP_WORDS               数组变量,包含当前命令行所有单词
COMPREPLY                数组变量,包含由 shell 函数生成的可能的补全代码
COPROC                   数组变量,包含用于匿名协程 I/O 的文件描述符
DIRSTACK                 数组变量,包含目录栈的当前内容
EMACS                    设置为't'时,表明 emacs shell 缓冲区正在工作,行编辑功能被禁止
EPOCHREALTIME            包含自 Unix 纪元时(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数,包括微秒
EPOCHSECONDS             包含自 Unix 纪元时(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数,不包括微秒
ENV                      如果设置,则会在 bash shell 脚本运行之前先执行已定义的启动文件(仅当 bash shell以 POSIX 模式被调用时)
EUID                     当前用户的有效用户 ID(数字形式)
EXECIGNORE               以冒号分隔的过滤器列表,在使用 PATH 搜索命令时,用于决定要忽略的可执行文件(比如共享库文件)
FCEDIT                   供 fc 命令使用的默认编辑器
FIGNORE                  在进行文件名补全时可以忽略后缀名列表,以冒号分隔
FUNCNAME                 当前正在执行的 shell 函数的名称
FUNCNEST                 当设置成非 0 值时,表示所允许的函数最大嵌套级数(一旦超出,当前命令即被终止)
GLOBIGNORE               以冒号分隔的模式列表,定义了在进行文件名扩展时可以忽略的一组文件名
GROUPS                   数组变量,包含当前用户的属组
histchars                控制历史记录扩展,最多可有 3 个字符
HISTCMD                  当前命令在历史记录中的编号
HISTCONTROL              控制哪些命令留在历史记录列表中
HISTFILE                 保存 shell 历史记录的文件名(默认是.bash_history)
HISTFILESIZE             历史记录文件(history file)能保存的最大命令数量
HISTIGNORE               以冒号分隔的模式列表,用于决定忽略历史文件中的哪些命令

设置 PATH 环境变量

PS3                    select 命令的提示符
PS4                    在命令行之前显示的提示符(如果使用了 bash 的-x 选项的话)
PWD                    当前工作目录
RANDOM                 返回一个 0~32 767 的随机数(对该变量的赋值可作为随机数生成器的种子)
READLINE_LINE          当使用 bind –x 命令时,保存 Readline 缓冲区的内容
READLINE_POINT         当使用 bind –x 命令时,指明了 Readline 缓冲区内容插入点的当前位置
REPLY read             命令的默认变量
SECONDS                自shell 启动到现在的秒数(对其赋值会重置计数器)
SHELL                  bash shell 的完整路径名
SHELLOPTS              以冒号分隔的已启用的 bash shell 选项
SHLVL                  shell 的层级,每启动一个新的 bash shell,该值增加 1 
TIMEFORMAT             指定了 shell 的时间显示格式
TMOUT                  select 命令和 read 命令在无输入的情况下等待多久(以秒为单位,默认值为 0,表示一直等待)
TMPDIR                 目录名,保存 bash shell 创建的临时文件
UID                    当前用户的真实用户 ID(数字形式)

设置 PATH 环境变量
PATH 环境变量的内容如下所示:

$ echo $PATH

你可以把新的搜索目录添加到现有的 PATH 环境变量中,无须从头定义。PATH 中各个目录之间以冒号分隔。
只需引用原来的 PATH 值,添加冒号(:),然后再使用绝对路径输入新目录即可。在 CentOS Linux 系统中,就像下面这样:

$ ls /home/christine/Scripts/ 
myprog 
$ echo $PATH 
/home/christine/.local/bin:/home/christine/bin:/usr/local/bin:/usr/ 
bin:/usr/local/sbin:/usr/sbin 
$ 
$ PATH=$PATH:/home/christine/Scripts 
$ 
$ myprog 
The factorial of 5 is 120 
$ 


将该目录加入 PATH 环境变量之后,就可以在虚拟目录结构的任意位置执行这个程序了。

$ cd /etc
$ myprog
The factorial of 5 is 120 
$


6.定位系统环境变量
. $HOME 目录下的启动文件
其余的启动文件都用于同一个目的:提供用户专属的启动文件来定义该用户所用到的环境变量。
大多数 Linux 发行版只用这 4 个启动文件中的一两个。

$HOME/.bash_profile 
$HOME/.bashrc 
$HOME/.bash_login 
$HOME/.profile


7.数组变量
要为某个环境变量设置多个值,可以把值放在圆括号中,值与值之间以空格分隔:

$ mytest=(zero one two three four)
$ echo $mytest
$ echo ${mytest[2]}


要显示整个数组变量,可以用通配符*作为索引

$ echo ${mytest[*]}


也可以改变某个索引位置上的值:

$ mytest[2]=seven
$ echo ${mytest[2]}


至能用 unset 命令来删除数组中的某个值

$ unset mytest[2]
$ echo ${mytest[*]}
$ echo ${mytest[2]}
$ echo ${mytest[3]}


可以在 unset 命令后跟上数组名来删除整个数组:

$ unset mytest
$ echo ${mytest[*]}

你可能感兴趣的:(linux)