文章目录
什么是环境变量
环境变量存储shell会话和工作环境信息,允许在内存中存储数据,让程序和脚本能快速访问,存储了持久的数据
分类
- 全局变量
- 局部变量
注意:不同的linux发行版有自己的环境变量
全局环境变量
- 系统环境变量基本使用全大写字母,区分普通环境变量
- 全局环境变量作用范围:所有会话和所有生成的子shell
查看环境变量使用env或者printenv
$env //查看环境变量
$printenv HOME //不能使用env
/home/50485581
$echo $HOME //引用环境变量,加上$
/home/50485581
局部环境变量
- 作用范围:定义在它们的进程中可见
目前没有一个命令可以查看局部环境变量
set命令:全局变量、局部变量、用户定义变量,按照字母顺序对结果排序
创建自己的局部变量
设置局部用户定义变量
$my_variable="hello world"
$echo $my_variable
hello world
- 字符串用双引号
注意:设置局部变量后,生成一个子shell,那么在子shell中不可用
$my_variable="hello world"
$bash
$echo $my_variable
$exit
exit
$echo $my_variable
hello world
在子进程中设置局部变量,退出子进程,局部变量失效
设置全局环境变量
先创建一个局部环境变量,再把它导出到全局环境中
使用export命令
$my_variable="hello"
$export my_variable
$echo $my_variable
hello
$bash
$echo $my_variable
hello
$exit
exit
[50485581@shell.testing-studio.com ~]$echo $my_variable
hello
子shell中改变全局变量只对子shell有效,不会反映到父shell中,并且子shell中,使用export也不能改变父shell的值
$echo $my_variable
hello
$bash
$my_variable="world"
$echo $my_variable
world
$exit
exit
$echo $my_variable
hello
删除环境变量
使用unset命令,删除环境变量,不用$
$my_variable="hello"
$echo $my_variable
hello
$unset my_variable
$echo $my_variable
子进程中对全局变量进行修改和删除,均在子进程中生效,实际上在父进程中依然可用
默认shell环境变量
bash shell保留了unix bourne shell的环境变量,可以查看列表,不多进行描述
设置PATH环境变量
查看PATH环境变量
$echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/50485581/.local/bin:/home/50485581/bin
PATH中的目录使用冒号分割
添加PATH环境变量
$echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/50485581/.local/bin:/home/50485581/bin
$PATH=$PATH:/home/50485581/test
$echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/50485581/.local/bin:/home/50485581/bin:/home/50485581/test
定位环境变量
启动bash shell的3种方式
- 登录时作为默认登录shell
- 作为非登录shell的交互式shell
- 作为运行脚本的非交互shell
登录shell
5个不同文件里提取命令
- /etc/profile //默认的bash shell主启动文件
- $HOME/.bash_profle,每个用户登录时都会执行
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
1./etc/profile文件
每个发型版本是不一样的
2.用户目录下的4个文件
都是隐藏文件,每个用户可以编辑并添加用户的环境变量
交互shell
交互shell,比如bash命令,不会执行/etc/profile文件,会检查用户HOME下的.bashrc文件
$cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
非交互shell
系统执行shell脚本使用,可以通过BASH_ENV来查看,但是BASH_ENV没有配置
$printenv BASH_ENV
$
环境变量持久化
数组变量
$my_test=(one two three four file) //定义数组
$echo ${my_test[0]} //输出单个值
one
$echo ${my_test[*]} //输出整个数组
one two three four file
$echo ${my_test[@]}
one two three four file
$my_test[1]=six //修改某个值
$echo ${my_test[1]}
six
$unset my_test[1] //删除某个值
$echo ${my_test[*]}
one three four file
$unset my_test //删除整个数组,只要加上数组名
$echo ${my_test[*]}