【Linux命令行与Shell脚本编程】第六章 Linux 环境变量

Linux命令行与Shell脚本编程

第六章 Linux 环境变量



六,Linux 环境变量

环境变量;创建自己的局部变量;删除环境变量;默认的shell环境变量;设置PATH环境变量;定位环境文件;数组变量

6.1,环境变量简介

bash shell使用 环境变量 来存储 shell会话和工作环境 的相关信息。
环境变量允许在内存中存储数据,以便 shell中运行的程序或脚本能够轻松访问到这些数据。这也是存储持久数据的一种简便方法。

bash shell中有两种环境变量。
    ·全局变量
    ·局部变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。
局部环境变量则只对创建它的shell可见。
6.1.1,全局环境变量
系统环境变量基本上会使用全大写字母,以区别于用户自定义的环境变量

使用env命令或printenv命令来查看全局变量
    $ printenv
    USER=christine
    PWD=/home/christine
    HOME=/home/christine
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    ...
    
显示个别环境变量的值,可以使用 printenv 命令:
    $ printenv HOME
    /home/christine
    $ env HOME
    env: 'HOME': No such file or directory
使用echo命令显示变量的值。在引用某个环境变量时,必须在该变量名前加上美元符号($):
    $ echo $HOME
    /home/Christine
变量名前加上$ 不仅能够显示变量当前的值,还能让变量作为其他命令的参数:
    $ ls $HOME
6.1.2,局部环境变量 set
局部环境变量只能在定义它的进程中可见。
Linux系统默认也定义了 标准的局部环境变量。可以定义自己的局部变量。

set 命令 :显示特定进程的 所有环境变量,包括 局部变量、全局变量,用户自定义变量,局部shell函数.
    $ set
    BASH=/bin/bash
    HOME=/home/christine
    colors=/home/christine/.dircolors
    my_variable='Hello World'

6.2,创建局部变量

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"
没有引号,则bash shell会将下一个单词[插图](World)视为另一个要执行的命令.

生父进程与子进程生成的局部变量对方无法使用.
6.2.2,设置全局环境变量
创建全局环境变量的方法是 先创建局部变量,然后将其导出到全局环境中

export命令 要导出的变量名(不加$符号)
    $ my_variable="I am Global now"
    $ export my_variable
    $ echo $my_variable

可以将设置变量和导出变量放在一个命令里完成:
    export my_variable="I am Global Now"
!!!!! 子shell 对全局变量的改变无法作用到父shell(export 命令也不可以);父shell会影响到子shell;

修改变量 等同于赋值
    my_variable=12345
当变量已经导出为全局变量时,修改环境变量不需要再次 export;

6.3,删除环境变量

unset命令 删除环境变量
    $ my_variable="I am going to be removed"
    $ echo $my_variable
    I am going to be removed
    $ unset my_variable
    
用到变量,就使用$;要操作变量,则不使用$;printenv例外; 

类似修改变量,子进程删除全局变量对父进程无效;   

6.4,默认的shell环境变量

bash shell会用一些特定的环境变量来定义系统环境。变量在 Linux系统中都已设置好。
由于bash shell源自最初的 Unix Bourne shell,保留了Unix Bourne shell中定义的环境变量。

bash shell与Unix Bourne shell兼容的环境变量

变量描述
CDPATH以 : 分割的目录列表,作为cd命令的搜索路径
HOME当前用户主目录
IFSshell用来将文本字符串分割成字段的若干字符
MAIL当前用户收件箱的文件名(bash shell检测此文件确认是否有新邮件)
MAILPATH以分号分割的当前用户收件箱的文件名列表(bash检测所有文件来确认是否有新邮件)
OPTARG有getopt命令处理的最后一个选项参数
OPTIND由getopt命令处理的最后一个选项参数的索引
PATHsh 查找命令时使用的目录列表,以 : 分割
PS1sh 命令行主提示符 默认 [\w]$
PS2sh 命令行次提示符

bash shell环境变量

变量描述
BASHbash shell当前实例的完整路径名
BASH_ALIASES关联数组,包含当前已设置的别名
BASH_ARGC数组变量,包含传入函数或shell脚本的参数个数
BASH_ARCV数组变量,包含传入函数或shell脚本的参数
BASH_ARCVO包含shell的名称或shell脚本的名称 ( 如果在脚本中用的话
BASH_CMDS关联数组,包含shell已执行过的命令的位置
BASH_COMMAND正在执行或将要执行的shell命令
BASH_COMPAT指定shel兼容级别的值
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_VERSIONbash shell当前实例的版本号
BASH_XTRACEFD如果设置为有效的文件描述符 (0、1、2),则’set -x 调试选项生成的跟踪输出可被重定向。通常用于将跟踪信息输出到文件中
BASHOPTS当前启用的bash shell选项
BASHPID当前bash进程的PID
CHILD_MAX设置shell能够记住的已退出子进程状态的数量
COLUMNSbash shell当前实例所用的终端显示宽度
COMP_CWORD变量COMP_WORDS的素引,其中包含当前光标的位置
COMP_LINE当前命令行
COMP_POINT相对于当前命令起始处的光标位置索引
COMP_KEY用来调用shell函数补全功能的最后一个按键
COMP_TYPE个整数值,指明了用以完成shell函数补全所尝试的补全类型
COMP_WORDBREAKSReadline库中用于单词补全的分阳符
COMP_WORDS数组变量,包含当前命令行所有单词
COMPREPLY数组变量,包含由shell函数生成的可能的补全代码
COPROC数组变量,包含用于匿名协程IO的文件描述符
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 shel脚本运行之前先执行已定义的启动文件(仅当bash shel以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以冒号分隔的模式列表,用于决定忽略历史文件中的哪些命令
HISTSIZE能写入历史记录列表 (history list)的最大命令数量 位于内存,bash会话期间更新
HISTTIMEFORMAT如果设置目不为空,则作为格式化字符串,用于打印bash历史记录中命令的时间截
HOSTFILEshell在补全主机名时读取的文件名当前主机的名称
HOSTNAME当前主机的名称
HOSTTYPE字符串,用于描述当前运行bash shell的机器
IGNOREEOFshell在退出前必须连续接收到的EOF字符数量(如果该值不存在,则默认为1)
INPUTRCReadline的初始化文件名(默认为inputrc)
INSIDE_EMACS仅当进程在Emacs编辑器的缓中区中运行时才设置,并目可以禁用行编援(行编援的禁用也取决于TERM变量的值)
LANGshell的语言环境种类(locale category)
LC_ALL定义语言环境种类,能够夏盖LANG变量
LC_COLLATE设置字符串排序时采用排序规则
LC_CTYPE决定如何解释出现在文件名扩展和模式匹配中的字符
LC_MESSAGES决定在解释前面带有$的双引号字符串时采用的语言环境设置
LC_NUMERIC决定格式化数字时采用的语言环境设置
LC_TIME决定格式化日期和时间时采用的语言环境设置
LINENO当前正在执行的脚本语句的行号
LINES定义了终端上可见的行数
MACHTYPE用“CPU-公司-系统”( CPU-company-system)格式定义的系统类型
MAILCHECKshell应该多久检查一次新邮件( 以秒为单位,默认为60秒 )
MAPFILE数组变量,当未指定数组变量作为参数时,其中保存了mapfile所读入的文本
OLDPWDshell先前使用的工作目录
OPTERR如果设置为1,则bash shell会显示getopts命令产生的错误
OSTYPE定义了shell所在的操作系统
PIPESTATUS数组变量,包含前台进程的退出状态
POSIXLY_CORRECT如果设置的话,bash会以POSIX模式启动
PPIDbash shell父进程的PID
PROMPT_COMMAND如果设置的话,在显示命令行主提示符之前执行该命令
PROMPT_DIRTRIM用来定义使用提示符字符宰w和 W转义时显示的拖尾( traling )目录名的数量( 使用一组英文句点替换被删除的目录名
Pso如果设置的话,指定了在输入命令之后、执行命令之前由交互式shell显示的内容
PS3select命令的提示符
PS4在命令行之前显示的提示符( 如果使用了bash的-x选项的话
PWD当前工作目录
RANDOM返回一个0 ~ 32 767的随机数( 对该变量的赋值可作为随机数生成器的种子1
READLINE_LINE当使用bind -x命今时,保存Readline缓冲区的内容
READLINE_POINT当使用bind -x命令时,指明了Readline缓中区内容插入点的当前位置
REPLYread命令的默认变量
SECONDS自shell启动到现在的秒数(对其赋值会重置计数器
SHELLbash shell的完整路径名
SHELLOPTS以冒号分隔的已启用的bash shell选项
SHLVLshell的层级,每启动一个新的bash shell,该值增加1
TIMEFORMAT指定了shell的时间显示格式
TMOUTselect命令和read命令在无输入的情况下等待多久( 以秒为单位,默认值为0,表示一直等待1
TMPDIR目录名,保存bash shell创建的临时文件
UID当前用户的真实用户ID 数字形式

6.5,设置PATH环境变量

在CLI中输入一个外部命令时,shell 搜索系统,从中找到对应的程序。PATH环境变量定义了用于查找命令和程序的目录.
PATH中的目录之间以冒号分隔。shell会在其中查找命令和程序。
    $ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    
如果命令或者程序所在的位置没有包括在PATH变量中,那么在不使用绝对路径的情况下,shell是无法找到的。shell在找不到指定的命令或程序时会产生错误信息

可以把新的搜索目录添加到现有的PATH环境变量中.添加冒号:使用绝对路径输入新目录.
    $ PATH=$PATH:/home/christine/Scripts
希望程序位置也可用于子shell,则务必确保将修改后的PATH环境变量导出。
对于PATH变量的修改只能持续到退出或重启系统。这种效果并不能一直奏效。下一节会介绍如何永久保持环境变量的改动。

6.6,定位环境文件 – 让环境变量的作用持久化

当登录Linux系统启动bash shell时,默认情况下bash会在几个文件中查找命令。(称为启动文件或环境文件)

启动bash shell有以下3种方式:
    ·登录时作为默认登录shell;
    ·作为交互式shell,通过生成子shell启动;
    ·作为运行脚本的非交互式shell。
bash shell在不同启动方式下执行的启动文件如下   
6.6.1,登录shell
bash shell会作为登录shell启动。登录shell通常会从5个不同的启动文件中读取命令。
    · /etc/profile  
    · $HOME/.bash_profile
    · $HOME/.bashrc
    · $HOME/.bash_login
    · $HOME/.profile     
    
有些 Linux发行版使用了 '可拆卸式认证模块PAM'(pluggable authentication module)
    PAM文件会在 bash shell启动之前被处理,可能会包含环境变量。
    PAM文件包括 /etc/environment 文件和 $HOME/.pam_environment 文件  
1,/etc/profile
系统中默认的bash shell的主启动文件。
系统中的每个用户登录时都会执行这个启动文件。    

Centos,Ubuntu 两种发行版的 /etc/profile 文件都使用 for语句来迭代/etc/profile.d目录下的所有文件。
shell会在用户登录时执行这些文件
大部分应用程序会创建两个启动文件:一个供bash shell使用(扩展名为.sh),另一个供C shell使用(扩展名为.csh)。  
2.$HOME目录下的启动文件
提供用户专属的启动文件来定义该用户所用到的环境变量。

大多数Linux发行版只用这4个启动文件中的一两个。
    · $HOME/.bash_profile
    · $HOME/.bashrc
    · $HOME/.bash_login
    · $HOME/.profile
位于用户的 $HOME目录下,每个用户可以对其编辑并添加自己的环境变量,其中的环境变量会在每次启动 bash shell会话时生效。
    shell会按照下列顺序执行第一个被找到的文件,余下的则被忽略。
    · $HOME/.bash_profile
    · $HOME/.bash_login
    · $HOME/.profile
$HOME/.bashrc 文件 通常通过其他文件运行。
6.6.2,交互式shell进程
不是在登录系统时启动的bash shell,那么这时的shell称作交互式shell(在命令行中输入bash)。

交互式shell启动的bash并不处理/etc/profile文件,只检查用户 $HOME/.bashrc 文件。
6.6.3,非交互式shell
系统执行shell脚本时使用 非交互式shell
脚本能以不同的方式执行。只有部分执行方式会启动子shell

非交互式shell 没有命令行提示符, 但当在系统中运行脚本时,希望能够运行一些特定的启动命令。

bash shell提供了 BASH_ENV环境变量。当 shell启动一个非交互式shell进程时,会检查BASH_ENV环境变量以查看要执行的启动文件名。
    1,如果有指定的文件,则shell会执行该文件里的命令(通常包括shell脚本变量设置)。
    2,如果未设置BASH_ENV变量,shell脚本 通过启动一个子shell来执行的。
        子shell会继承父shell的导出变量。
        如果父shell是登录shell,在/etc/profile文件、/etc/profile.d/*.sh文件和$HOME/.bashrc文件中 设置并导出了变量,那么执行脚本的子shell就能继承这些变量。

对于 不启动 子shell 的脚本,变量已经存在于当前shell。没有设置BASH_ENV时,也可以使用当前shell的局部变量和全局变量
6.6.4,环境变量持久化
利用这 shell环境文件 创建 永久性全局变量或局部变量。

对全局环境变量设置放在/etc/profile文件中时。如果升级了所用的发行版,该文件也会随之更新,所有定制过的变量设置 会消失。
!!在/etc/profile.d目录中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置都放在这个文件中。

保存个人用户永久性 bash shell变量的最佳地点是 $HOME/.bashrc 文件。适用于所有类型的 shell进程。
    但如果设置了BASH_ENV变量, 除非值为 $HOME/.bashrc,否则应该将非交互式 shell的用户变量放在指定的地方。

图形化界面组成部分的环境变量 可能需要在另外一些配置文件中设置。

alias命令设置无法持久生效。可以把个人的alias设置放在$HOME/.bashrc启动文件中,使其效果永久化。

6.7,数组变量

环境变量 可以作为数组使用。能够存储多个值的变量。这些值既可以单独引用,也可以作为整体引用。环境变量数组的索引都是从0开始.

为某个环境变量设置多个值,把值放在 () 中,值与值之间以空格分隔:
    $ mytest=(zero one two three four)
    $ echo $mytest
    zero
    $ echo ${mytest[2]}
    two
要显示整个数组变量,可以用通配符*作为索引:
    $ echo ${mytest[*]}
    zero one two three four
可以改变某个索引位置上的值:
    $ mytest[2]=seven
用unset命令来删除数组中的某个值: 删除后 数组索引不会随之改变
    $ unset mytest[2]
    $ echo ${mytest[*]}
    zero one three four
    $ echo ${mytest[2]}
    
    $ echo ${mytest[3]}
    three
删除整个数组
    $ unset mytest

数组变量只会把事情搞得更复杂,在shell脚本编程时 不常用。
数组并不太方便移植到其他shell环境 。有些bash系统环境变量用到了数组(BASH_VERSINFO)。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值