计算机网络/计算机科学与应用/系统/运维/开发

Shell脚本编程 必须要知道的环境变量

一、什么是Shell环境变量

1、什么是环境变量

  • 环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行

  • 环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失

  • 如果希望永久保存环境变量,可在用户家目录下的.bash_profile或.bashrc(非用户登录模式特有,例如远程SSH)文件中,或者全局配置/etc/bashrc(非用户登录模式特有,例如远程SSH)或/etc/profile文件中定义

  • 在将环境变量放入上述的文件中后,每次用户登录时这些变量都将被初始化

  • 按照系统规范,所有环境变量的名字均采用大写形式

  • 在将环境变量应用于用户进程程序之前,都应该用export命令导出定义,

    例如:正确的环境变量定义方法为export OLDGIRL=1

  • 有一些环境变量,比如HOME、PATH、SHELL、UID、USER等,在用户登录之前就已经被/bin/login程序设置好了

  • 通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile中

2、通过3个变量来查看设置的变量的值

set、env、declare

set命令输出所有变量(全局变量和局部变量)

env只显示全局变量

declare输出所有的变量、函数、整数和已经导出的变量

[root@Linux myshell]# env|tail
PWD=/root/myshell
LANG=en_US.UTF-8
OLDBOY=oldboy
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
[root@Linux myshell]# declare|tail
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
TERM=xterm-16color
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=69360
_=
colors=/root/.dircolors
[root@Linux myshell]# set|tail
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
TERM=xterm-16color
UID=0
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=69360
_=
colors=/root/.dircolors

二、自定义环境变量

1、设置环境变量 3种方式

export 变量名=value

变量名=value; export 变量名

declare -x 变量名=value  (此处不要在变量名前面加$)


实例:3种定义环境变量的例子

[root@Linux myshell]# export NAME=shell
[root@Linux myshell]# declare -x NAME=shell
[root@Linux myshell]# NAME=shell ; export NAME
[root@Linux myshell]# echo $NAME
shell


实例:自定义全局环境变量

[root@Linux myshell]# cat /etc/profile | grep OLD
# <== 编辑/etc/profile ,然后输出此行并保存
[root@Linux myshell]# export OLDBOY='oldboy'
# <== 或. /etc/porfile 使其生效
[root@Linux myshell]# source /etc/profile
[root@Linux myshell]# 
# <== 在变量前加$符号并打印变量值
[root@Linux myshell]# echo $OLDBOY
oldboy
# <== 查看定义结果
[root@Linux myshell]# env|grep OLDBOY
OLDBOY=oldboy


设置环境变量——export命令

自己定义的变量并不会自动成为环境变量,要想设置环境变量,需要使用export命令

[root@VM-4-2-centos myscript]# CONFIG_FILE=/home/miyake/conf.txt
[root@VM-4-2-centos myscript]# export CONFIG_FILE


上述环境变量设置也可以写成一行:

export  CONFIG_FILE=/home/miyake/conf.txt


2、其他环境变量

BASH: 保存bash 全路径
BASE_VERSION: 保存当前bash命令的版本信息
LINENO:保存当前所执行的脚本文件的行号
LANG :设置当前的国家/地区和语言等信息
中文环境下的变量LANG
echo $LANG
将LANG设置为美国的英文环境
$.UTF-8
locale:查看当前的地区设置
PATH :保存的是shell启动命令时的目录,目录以字符串的形式指定,不同的目录位置通过冒号来分隔。
IFS:用于设置shell中的分隔符


三、让环境变量永久生效的常用设置文件

1、用户的环境变量配置

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


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


2、全局环境变量的配置

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

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


四、设置登录提示的2种方式

1、第一种是在/etc/motd里增加提示的字符串

# cat /etc/motd
Welcome to Alibaba Cloud Elastic Compute Service !


修改登录后提示如下:

Last login: Fri Oct 28 10:57:17 2022
Welcome to zth Cloud Elastic Compute Service !


2、在/etc/profile.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


五、显示与取消环境变量

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


常见的系统环境变量:


$HOME:当前用户主目录的全路径

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

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

$SHELL:当前登录shell的全路径

$USER:当前用户


实例:通过echo和printf 打印环境变量

[root@VM-4-2-centos myscript]# echo $HOME
/root
[root@VM-4-2-centos myscript]# echo $PWD
/root/myscript
[root@VM-4-2-centos myscript]# echo $SHELL
/bin/bash
[root@Linux ~]# printf "$HOME\n"
/root


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

env(printenv) 查看当前的环境变量列表


[root@VM-4-2-centos myscript]# printenv
XDG_SESSION_ID=267526
HOSTNAME=VM-4-2-centos
TERM=xterm
...


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

[root@Linux ~]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
...


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

[root@Linux ~]# echo $USER
root
[root@Linux ~]# unset USER
[root@Linux ~]# echo $USER


六、环境变量总结

  • 变量名通常要大写

  • 变量可以在自身的shell及子shell中使用

  • 常用export 来定义环境变量

  • env默认可以显示所有的环境变量

  • 输出变量 $变量名  取消变量 unset 变量名

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

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

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


环境变量

人各有命,但命运也从来不是随机发牌,而是每个人主动选择的结果。

评论

^