本章内容:
- 环境变量
- 创建自己的局部变量
- 删除环境变量
- 设置 PATH 环境变量
- 定位环境文件
- 数组变量
Linux 环境变量能帮你提升 Linux shell 的使用体验。很多程序和脚本通过环境变量来获取系统信息、存储临时数据和配置信息。在 Linux 系统中,有很多地方可以设置环境变量,了解去哪里设置相应的环境变量很重要。
全局环境变量对于 shell 会话和所有生成的子 shell 都是可见的。局部环境变量则只对创建它的 shell 可见。
env
命令或 printenv
命令来查看全局变量:[root@VM-8-11-centos ~]# printenv
XDG_SESSION_ID=351727
HOSTNAME=VM-8-11-centos
TERM=xterm
SHELL=/bin/bash
HISTSIZE=3000
...
printenv
命令或 echo
命令显示个别环境变量的值:# 1.使用printenv显示。
[root@VM-8-11-centos ~]# printenv XDG_SESSION_ID
351727
# 2.使用echo显示。
[root@VM-8-11-centos ~]# echo $XDG_SESSION_ID
351727
局部环境变量只能在定义它的进程中可见。尽管是局部的,但是局部环境变量的重要性丝毫不输全局环境变量。
set
命令查看局部环境变量:[root@VM-8-11-centos ~]# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="00" [2]="15" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
BASH_VERSION='3.00.15(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=99
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=hnlinux
HOSTTYPE=i386
IFS=$' '
INPUTRC=/etc/inputrc
KDEDIR=/usr
LANG=zh_CN.GB2312
...
set
命令可以显示特定进程的所有环境变量,既包括局部变量、全局变量,也包含用户自定义变量及局部 shell 函数,还会按照字母顺序对结果进行排序。启动 bash shell(或者执行 shell 脚本)之后,就能创建仅对该 shell 进程可见的局部用户自定义变量。可以使用等号为变量赋值,值可以是数值或字符串。
# 1.自定义变量及值(如果赋值的字符串包含空格,则必须用单引号或者双引号来界定该字符串的起止)。
[root@VM-8-11-centos ~]# my_variable="Hello World"
# 2.显示定义好的局部用户自定义变量。
[root@VM-8-11-centos ~]# echo $my_variable
Hello World
全局环境变量在设置该变量的父进程所创建的子进程中都是可见的。创建全局环境变量的方法是先创建局部变量,然后再将其导出到全局环境中。
export
命令:# 1.先创建局部变量。
[root@VM-8-11-centos ~]# my_variable="I am Global now"
# 2.使用export导出到全局环境。
[root@VM-8-11-centos ~]# export my_variable
# 3.显示定义好的全局环境变量。
[root@VM-8-11-centos ~]# echo $my_variable
I am Global now
[root@VM-8-11-centos ~]# export my_var="I am Global now"
[root@VM-8-11-centos ~]# echo $my_var
I am Global now
既然可以创建新的环境变量,自然也能删除已有的环境变量。可以使用
unset
命令来完成这个操作。
# 1.设置全局环境变量并显示。
[root@VM-8-11-centos ~]# export my_variable="Hello"
[root@VM-8-11-centos ~]# echo $my_variable
Hello
# 2.删除该环境变量。
[root@VM-8-11-centos ~]# unset my_variable
[root@VM-8-11-centos ~]# echo $my_variable
PATH 环境变量定义了用于查找命令和程序的目录。
# PATH中的目录之间以冒号分隔,shell 会在其中查找命令和程序。
[root@VM-8-11-centos ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
#!/usr/bin/env bash
作为脚本第一行。这种方法的优点在于 env
会在 $PATH
中搜索 bash ,使脚本具备更好的可移植性。PATH
环境变量中(将该目录加入到 PATH 环境变量之后,就可以在虚拟目录结构的任意位置执行这个程序了):# 1.使用冒号:绝对路径。
[root@VM-8-11-centos ~]# PATH=$PATH:/home/scripts
通过上面的步骤,已经知道如何修改系统环境变量,也知道如何创建自己的变量。接下来就是怎样让环境变量作用持久化。
当你登录 Linux 系统时,bash shell 会作为登录 shell 启动。登录 shell 通常会从 5 个不同的启动文件种读取命令。
5.1.1 /etc/profile 文件
[root@VM-8-11-centos my]# cat /etc/profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
for
语句来迭代 /etc/profile.d 目录下的所有文件。[root@VM-8-11-centos my]# ls /etc/profile.d/
256term.csh abrt-console-notification.sh colorgrep.csh colorls.csh csh.local lang.sh less.sh mpi-selector.sh vim.csh which2.csh
256term.sh bash_completion.sh colorgrep.sh colorls.sh lang.csh less.csh mpi-selector.csh sh.local vim.sh which2.sh
5.1.2 $HOME 目录下的启动文件
大多数 Linux 发行版只用这 4 个启动文件中的一两个。注意这些文件都以点号开头,说明属于隐藏文件(不能直接使用
ls
命令看到)。
[root@VM-8-11-centos ~]# cat $HOME/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
如果不是在登录系统时启动的 bash shell( 比如在命令行输入
bash
),那么这时的 shell 称作交互式 shell 。与登录 shell 一样,交互式 shell 提供了命令行提示符供用户输入命令。而作为交互式 shell 启动的 bash 并不处理 /etc/profile 文件,只检查用户 $HOME 目录中的 .bashrc 文件。
[root@VM-8-11-centos ~]# cat $HOME/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
最后一种 shell 是非交互式 shell 。系统执行 shell 脚本时用的就是这种 shell 。不同之处在于它没有命令行提示符。当你希望能够运行一些特定的启动命令时,bash shell 提供了 BASH_ENV 环境变量。如果有指定的文件,则 shell 会执行该文件里的命令,这通常包括 shell 脚本变量设置。
# 1.如果变量未设置,则会显示一个空行。
[root@VM-8-11-centos ~]# echo $BASH_ENV
alias
命令设置无法持久生效,可以把个人的 alias
设置放在 $HOME/.bashrc 启动文件中,使其效果永久化。数组是能够存储多个值的变量。这些值既可以单独引用,也可以整体引用。
# 1.设置多个值。
[root@VM-8-11-centos ~]# my_var=(zero one two three)
# 2.引用单个数组元素(索引都是从 0 开始)。
[root@VM-8-11-centos ~]# echo ${my_var[2]}
two
# 3.显示整个数组变量。
[root@VM-8-11-centos ~]# echo ${my_var[*]}
zero one two three
# 4.改变某个索引位置上的值。
[root@VM-8-11-centos ~]# my_var[2]=six
[root@VM-8-11-centos ~]# echo ${my_var[2]}
six
# 5.使用unset删除数组中的单个元素。
[root@VM-8-11-centos ~]# unset my_var[2]
[root@VM-8-11-centos ~]# echo ${my_var[*]}
zero one three
[root@VM-8-11-centos ~]# echo ${my_var[2]}
# 6.使用unset删除整个数组变量。
[root@VM-8-11-centos ~]# unset my_var
[root@VM-8-11-centos ~]# echo ${my_var[*]}
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。