跟老男孩学Linux运维:Shell编程实战3.2 环境变量

3.2 环境变量


环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。

环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,因此,如果希望永久保存环境变量,可在用户家目录下的.bash_prof?ile或.bashrc(非用户登录模式特有,例如远程SSH)文件中,或者全局配置/etc/bashrc(非用户登录模式特有,例如远程SSH)或/etc/prof?ile文件中定义。在将环境变量放入上述的文件中后,每次用户登录时这些变量都将被初始化。

按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应该用export命令导出定义,例如:正确的环境变量定义方法为export OLDGIRL=1。

有一些环境变量,比如HOME、PATH、SHELL、UID、USER等,在用户登录之前就已经被/bin/login程序设置好了。通常环境变量被定义并保存在用户家目录下的.bash_prof?ile文件或全局的配置文件/etc/prof?ile中,具体的环境变量说明参见表3-1。

表3-1 部分bash环境变量展示(执行env命令后获得)

变量名 含  义

_= 上一条命令的最后一个参数

BASH=/bin/bash 调用bash实例时使用的全路径名

BASH_VERSINFO=([0]="3"[1]="2"[2]="25" [3]="1"[4]="release"[5]="x86_64-redhat-linux-gnu") 使用2.0以上版本时,展开为版本信息

BASH_VERSION='3.2.25(1)-release' 当前bash实例的版本号

COLORS=/etc/DIR_COLORS 颜色变量

COLUMNS=132 设置该变量,就给Shell编辑模式和选择的命令定义了编辑窗口的宽度

DIRSTACK=() 代表目录栈的当前内容

EUID=0 在Shell启动时被初始化的当前用户的有效ID

GROUPS=() 当前用户所属的组

HISTFILE=/root/.bash_history 历史记录文件的全路径

HISTFILESIZE=50 历史文件能包含的最大行数

HISTSIZE=50 记录在命令行历史文件中的命令行数

HOME=/root 当前用户家目录

HOSTNAME=oldboy 当前主机名称

HOSTTYPE=x86_64 当前操作系统类型

IFS=$'\t\n' 内部字段分隔符,一般是空格符、制表符和换行符,用于划分由命令替换、循环结构中的表和所读取的输入产生的词的字段

INPUTRC=/etc/inputrc readline启动文件的文件名,取代默认的~/.inputrc

JAVA_HOME=/application/jdk1.6.0_10 JAVA HOME环境变量

LANG=zh_CN.UTF-8 字符集

LOGNAME=root 登录用户名称

MACHTYPE=x86_64-redhat-linux-gnu 包含一个描述正在运行bash的系统串

MAILCHECK=60 这个参数定义Shell将隔多长时间(以秒为单位)检查一次由参数MAILPATH或MAILFILE指定的文件,看看是否有邮件到达。默认值为600s

MAIL=/var/spool/mail/root 邮件全路径

OLDPWD=/root 前一个当前工作目录

OPTIND=1 下一个由getopts内置命令处理的参数的序号

OSTYPE=linux-gnu 自动设置成一个串,该串描述正在运行bash的操作系统,默认值由系统来决定

PATH=/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:

/usr/kerberos/bin

:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/bin:

/server/script/shangxian:/root/bin 全局PATH路径,命令搜索路径。一个由冒号分隔的目录列表,Shell用它来搜索命令。默认路径由系统来决定,并且由安装bash的管理员来设置

PIPESTATUS=([0]="0"[1]="0") 一个数组,包含一列最近在管道执行的前台作业的进程退出的状态值

PPID=1112 父进程的进程ID

PS1='[\u@\h \W]\$ ' 主提示符串,默认值是$

PS2='>' 次提示符串,默认值是>

PS4=`+` 当开启追踪时使用的是调试提示符串,默认值是+,追踪可用set –x开启

PWD=/home 当前用户家目录

RESIN_HOME=/application/resin-3.1.6 这是通过export人为设置的环境变量,java环境会用

SHELL=/bin/bash 登录Shell类型

SHELLOPTS=braceexpand:emacs:hashall:

histexpand:history:interactive-comments:monitor 包含一列开启的Shell选项

SHLVL=1 每启动一个bash实例就将其加1

TERM=vt100 终端设置

TMOUT=3600 退出前等待超时的秒数

UID=0 当前用户的UID,在Shell启动时初始化

USER=root 当前用户的用户名,在Shell启动时初始化

 

在查看设置的变量时,有3个命令可以显示变量的值:set、env和declare(替代早期的typeset)。set命令输出所有的变量,包括全局变量和局部变量;env命令只显示全局变量;declare命令输出所有的变量、函数、整数和已经导出的变量。set -o命令显示bash Shell的所有参数配置信息。

范例3-1:set、env和declare输出。

[root@oldboy ~]# env|tail

SHLVL=1

HOME=/root

LOGNAME=root

CVS_RSH=ssh

MODULESHOME=/usr/share/Modules

LESSOPEN=||/usr/bin/lesspipe.sh %s

G_BROKEN_FILENAMES=1

BASH_FUNC_module()=() {  eval `/usr/bin/modulecmd bash $*`

}

_=/bin/env

[root@oldboy ~]# declare|tail

_module_not_yet_loaded ()

{

    comm -23 <(_module_avail|sort) <(tr : '\n' <<<${LOADEDMODULES}|sort)

}

module ()

{

    eval `/usr/bin/modulecmd bash $*`

}

[root@oldboy ~]# set|tail

_module_not_yet_loaded ()

{

    comm -23 <(_module_avail|sort) <(tr : '\n' <<<${LOADEDMODULES}|sort)

}

module ()

{

    eval `/usr/bin/modulecmd bash $*`

}

[root@oldboy ~]# set -o|head

allexport       off

braceexpand     on

emacs           on

errexit         off

errtrace        off

functrace       off

hashall         on

histexpand      on

history         on

ignoreeof       off

3.2.1 自定义环境变量

1.?设置环境变量

如果想要设置环境变量,就要在给变量赋值之后或在设置变量时使用export命令,具体设置见下文的示例。其实,除了export命令,带-x选项的declare内置命令也可以完成同样的功能(注意:此处不要在变量名前面加$)。

export命令和declare命令的格式如下:

①export 变量名=value

②变量名=value ; export 变量名

③declare –x 变量名=value

提示: 以上为设置环境变量的3种方法。

范例3-2:定义环境变量并赋值的方法。

export NAME=oldboy

declare –x NAME=oldboy

NAME=oldboy ;export NAME

以下是自定义全局环境变量的示例:

[root@oldboy script]# cat /etc/profile|grep OLD

export OLDBOY='oldboy' #<==编辑/etc/profile,然后输出此行并保存

[root@oldboy script]# source /etc/profile #<==或. /etc/profile使其生效

[root@oldboy script]# echo $OLDBOY #<==在变量前加$符号并打印变量值

oldboy

[root@oldboy script]# env|grep OLDBOY #<==查看定义结果

OLDBOY=oldboy

下面来看看让环境变量永久生效的常用设置文件。

(1)用户的环境变量配置

配置如下:

[root@oldboy scripts]# ls /root/.bashrc #<==推荐在此文件中优先设置

/root/.bashrc

[root@oldboy scripts]# ls /root/.bash_profile

/root/.bash_profile

提示: 对于用户的环境变量设置,比较常见的是用户家目录下的.bashrc和.bash_profile。

(2)全局环境变量的配置

常见的全局环境变量的配置文件如下:

/etc/profile

/etc/bashrc #<==推荐在此文件中优先设置

/etc/profile.d/

若要在登录后初始化或显示加载内容,则把脚本文件放在/etc/prof?ile.d/下即可(无须加执行权限)。

2.?设置登录提示的两种方式

第一种是在/etc/motd里增加提示的字符串,如下:

[root@oldboy ~]# cat /etc/motd #<==文件里仅为字符串内容

welcome to oldboy linux Shell training.

登录后显示内容如下:

Last login : Fri Nov  7 15 :36 :56 2016 from 10.0.0.100

welcome to oldboy linux Shell training.

第二种是在/etc/prof?ile.d/下面增加如下脚本。

[root@oldboy ~]# cat /etc/profile.d/oldboy.sh #<==这里是脚本的内容

echo " Here is oldboy training "

登录后显示的内容如下:

Last login : Fri Nov  7 15 :36 :56 2016 from 10.0.0.100

Here is oldboy training

以下是在生产场景下(在Java环境中),自定义环境变量的示例。

export JAVA_HOME=/application/jdk

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

export RESIN_HOME=/application/resin

提示: 上述的环境变量设置通常放在/etc/profile全局环境变量里。

如果是写Java的脚本,那么最好是把上述Java环境配置放入脚本内重新定义,特别是作为定时任务执行的脚本。

3.2.2 显示与取消环境变量

1.?通过echo或printf命令打印环境变量

下面我们先来看看常见的系统环境变量。

$HOME:用户登录时进入的目录。

$UID:当前用户的UID(用户标识),相当于id?-u。

$PWD:当前工作目录的绝对路径名。

$SHELL:当前SHELL。

$USER:当前用户。

......

范例3-3:通过echo和printf命令打印环境变量。

[oldboy@oldboy ~]$ echo $HOME

/home/oldboy

[oldboy@oldboy ~]$ echo $UID

504

[oldboy@oldboy ~]$ echo $PWD

/home/oldboy

[oldboy@oldboy ~]$ echo $SHELL

/bin/bash

[oldboy@oldboy ~]$ echo $USER

oldboy

[root@oldboy ~]# printf "$HOME\n"

#<==printf是一个更复杂的格式化打印内容的工具,一般不需要

/root

提示: 在写Shell脚本时可以直接使用系统默认的环境变量,一般情况下是不需要重新定义的,在使用定时任务等执行Shell脚本时建议在脚本中重新定义。

2.?用env或set显示默认的环境变量

用env(printenv)显示默认环境变量的示例如下:

[oldboy@oldboy ~]$ env

HOSTNAME=oldboy

SHELL=/bin/bash

HISTSIZE=1000

LC_ALL=C

MAIL=/var/spool/mail/oldboy

PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/oldboy/bin

INPUTRC=/etc/inputrc

PWD=/home/oldboy

LANG=zh_cn.gb18030

SHLVL=1

HOME=/home/oldboy

LOGNAME=oldboy

中间和结尾省略若干代码

用set也可以显示环境变量(包括局部变量),如下:

[root@oldboy ~]# set

APACHEERR=hello

BASH=/bin/bash

BASH_ALIASES=()

BASH_ARGC=()

BASH_ARGV=()

BASH_CMDS=()

BASH_LINENO=()

BASH_SOURCE=()

BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")

BASH_VERSION='4.1.2(1)-release'

COLORS=/etc/DIR_COLORS

COLUMNS=103

中间和结尾省略若干代码

在3.2.1节还提到了一个相关的命令declare,大家还记得吗?

3.?用unset消除本地变量和环境变量

用unset消除本地变量和环境变量的示例如下:

[oldboy@oldboy ~]$ echo $USER

oldboy

[oldboy@oldboy ~]$ unset USER

[oldboy@oldboy ~]$ echo $USER

                                #<==此处为输出的空行

可以看到变量的内容显示为空。

环境变量的知识小结:

变量名通常要大写。

变量可以在自身的Shell及子Shell中使用。

常用export来定义环境变量。

执行env默认可以显示所有的环境变量名称及对应的值。

输出时用“$变量名”,取消时用“unset变量名”。

书写crond定时任务时要注意,脚本要用到的环境变量最好先在所执行的Shell脚本中重新定义。

如果希望环境变量永久生效,则可以将其放在用户环境变量文件或全局环境变量文件里。

3.2.3 环境变量初始化与对应文件的生效顺序

在登录Linux系统并启动一个bash shell时,默认情况下bash会在若干个文件中查找环境变量的设置。这些文件可统称为系统环境文件。bash检查的环境变量文件的情况取决于系统运行Shell的方式。系统运行Shell的方式一般有3种:

1) 通过系统用户登录后默认运行的Shell。

2) 非登录交互式运行Shell。

3) 执行脚本运行非交互式Shell。

当用户登录Linux系统时,Shell会作为登录Shell启动。此时的登录Shell加载环境变量的顺序如图3-1所示。

用户登录系统后首先会加载/etc/profile全局环境变量文件,这是Linux系统上默认的Shell主环境变量文件。系统上每个用户登录都会加载这个文件。

当加载完/etc/profile文件后,才会执行/etc/profile.d目录下的脚本文件,这个目录下的脚本文件有很多,例如:系统的字符集设置(/etc/sysconfig/i18n)等,在后文开发跳板机案例里,我们也把脚本的起始加载放到这个目录下,以便用户登录后即刻运行脚本。

之后开始运行$HOME/.bash_profile(用户环境变量文件),在这个文件中,又会去找$HOME/.bashrc(用户环境变量文件),如果有,则执行,如果没有,则不执行。在$HOME/.bashrc文件中又会去找/etc/bashrc(全局环境变量文件),如果有,则执行,如果没有,则不执行。

如果用户的Shell不是登录时启动的(比如手动敲下bash时启动或者其他不需要输入密码的登录及远程SSH连接情况 ),那么这种非登录Shell只会加载$HOME/.bashrc(用户环境变量文件),并会去找/etc/bashrc(全局环境变量文件)。因此如果希望在非登录Shell下也可读到设置的环境变量等内容,就需要将变量设定等写入$HOME/.bashrc或者/etc/bashrc,而不是$HOME/.bash_profile或/etc/profile。

时间: 2024-09-08 10:07:08

跟老男孩学Linux运维:Shell编程实战3.2 环境变量的相关文章

跟老男孩学Linux运维:Shell编程实战.

Linux/Unix技术丛书 跟老男孩学Linux运维: Shell编程实战 老男孩 著 图书在版编目(CIP)数据 跟老男孩学Linux运维:Shell编程实战 / 老男孩著. -北京:机械工业出版社,2017.1 (Linux/Unix技术丛书) ISBN 978-7-111-55607-7 I. 跟- II. 老- III. Linux操作系统 IV. TP316.85 中国版本图书馆CIP数据核字(2016)第313248号 跟老男孩学Linux运维:Shell编程实战 出版发行:机械工

跟老男孩学Linux运维:Shell编程实战2.6 Shell脚本的建立和执行

2.6 Shell脚本的建立和执行 2.6.1 Shell脚本的建立 在Linux系统中,Shell脚本(bash Shell程序)通常是在编辑器vi/vim中编写的,由UNIX/Linux命令.bash Shell命令.程序结构控制语句和注释等内容组成.这里推荐用Linux自带的功能更强大的vim编辑器来编写,可以事先做一个别名alias vi='vim',并使其永久生效,这样以后习惯输入vi的读者也就可以直接调用vim编辑器了,设置方法如下: [root@oldboy ~]# echo "a

跟老男孩学Linux运维:Shell编程实战1.2 学好Shell编程所需的基础知识

1.2 学好Shell编程所需的基础知识 本节首先来探讨一下在学习Shell编程之前需要掌握的基础知识,需要说明的是,并不是必须具备这些基础知识才可以学习Shell编程,而是,如果具备了这些基础知识,那么就可以把Shell编程学得更好,领悟得更深.如果只是想简单地了解Shell脚本语言,那么就无须掌握太多的系统基础知识,只需要会一些简单的命令行操作即可. 学好Shell编程并通过Shell脚本轻松地实现自动化管理企业生产系统的必备基础如下: 1)能够熟练使用vim编辑器,熟悉SSH终端及".vi

跟老男孩学Linux运维:Shell编程实战导读

前言 为什么要写这本书 目前全球正处于互联网+的时代,越来越多的传统企业都在通过互联网提供产品和服务,比如,互联网+教育.互联网+金融.互联网+电商.互联网+出租车.互联网+保险等,可以看到,几乎所有的产品.服务都能在网上找到.而支撑互联网的幕后英雄其实就是Linux(包括移动互联网在内),掌握Linux运维技术已经成为每一个IT技术人员的必备技能! 互联网+的时代下企业的网站流量呈爆炸式增长,如果你是运维人员,很可能要面对几十台.几百台.上千台甚至上万台的服务器设备,而对于企业来说,如何提高I

跟老男孩学Linux运维:Shell编程实战3.3 普通变量

3.3 普通变量 3.3.1 定义本地变量 本地变量在用户当前Shell生存期的脚本中使用.例如,本地变量oldboy的取值为bingbing,这个值只在用户当前Shell生存期中有意义.如果在Shell中启动另一个进程或退出,那么变量oldboy的值将会无效. 1.?普通变量定义 为普通变量的定义赋值,一般有以下3种写法: 变量名=value #<==赋值时不加引号 变量名='value' #<==赋值时加单引号 变量名="value" #<==赋值时加双引号 2.

跟老男孩学Linux运维:Shell编程实战1.3 如何才能学好Shell编程之“老鸟”经验谈

1.3 如何才能学好Shell编程之"老鸟"经验谈 学好Shell编程的核心:多练→多思考→再练→再思考,坚持如此循环即可! 从老男孩IT教育毕业的一名学生曾在工作多年后返校分享了一篇"如何学好Shell编程"的讲稿,经过老男孩的整理后和读者分享如下. (1)掌握Shell脚本基本语法的方法 最简单有效的方法就是将语法敲n+1遍.为什么不是n遍呢?因为这里的n指的是你刚开始为掌握语法而练习的那些天(21天法则),而1则是指在确定掌握语法后每天都要写一写.想一想,至少

跟老男孩学Linux运维:Shell编程实战2.4 脚本语言的种类

2.4 脚本语言的种类 2.4.1 Shell脚本语言的种类 Shell脚本语言是弱类型语言(无须定义变量的类型即可使用),在Unix/Linux中主要有两大类Shell:一类是Bourne shell,另一类是C shell. 1.?Bourne shell Bourne shell又包括Bourne shell(sh).Korn shell(ksh).Bourne Again Shell(bash)三种类型. Bourne shell(sh)由AT&T的Steve Bourne开发,是标准的

跟老男孩学Linux运维:Shell编程实战.2

第3章 Shell变量的核心基础知识与实践 3.1 什么是Shell变量 1.?什么是变量 在小学或初中时,我们开始接触数学方程式,例如:已知x=1,y=x+1,那么y等于多少? 在上述问题中,等号左边的x和y当时被称为未知数,但在Shell编程里它们是变量名,等号右边的1和x+1则是变量的内容(变量的值).注意,这里的等号符号被称为赋值,而不是等号. 通过上面的例子可以得出一个变量概念的小结论:简单地说,变量就是用一个固定的字符串(也可能是字符.数字等的组合)代替更多.更复杂的内容,该内容里可

跟老男孩学Linux运维:Shell编程实战2.3 Shell脚本在Linux运维工作中的地位

2.3 Shell脚本在Linux运维工作中的地位 Shell脚本语言很适合用于处理纯文本类型的数据,而Linux系统中几乎所有的配置文件.日志文件(如NFS.Rsync.Httpd.Nginx.LVS.MySQL等),以及绝大多数的启动文件都是纯文本类型的文件.因此,学好Shell脚本语言,就可以利用它在Linux系统中发挥巨大的作用. 图2-2形象地展示了Shell脚本在运维工作中的地位.   图2-2 Shell脚本在运维工作中的地位形象图

跟老男孩学Linux运维:Shell编程实战1.4 学完本书后可以达到何种Shell编程高度

1.4 学完本书后可以达到何种Shell编程高度 如果读者具备了前文提到Linux基础知识,认真地阅读并按照书中的内容去勤加练习,相信很快便可熟练掌握Shell编程,搞定企业场景中的绝大多数Shell编程问题,本书介绍了大量的核心互联网运维场景企业案例,相信对大家的工作会很有帮助. 如果再配合老男孩的Shell脚本教学视频,定能使你如虎添翼,相关视频一共有14部(数百课时),观看地址为:http://edu.51cto.com/pack/view/id-546.html,读者也可以扫描下面的二维