目录:
- 环境变量
- 创建局部变量
- 删除环境变量
- 默认shell环境变量
- 设置PATH环境变量
- 定位环境文件
- 数组变量
环境变量
环境变量:存储有关shell会话和工作环境的信息,便于程序或脚本能访问。
全局变量
全局变量对于shell会话和所有子shell都可见,即在子shell中也可以引用。
env 打印全部全局变量
printenv 打印全部全局变量
printenv HOME 显示某个环境变量
echo $HOME 加上$符号,显示某个环境变量,如果要用到变量加上$;如果要操作变量不加$。
ls $HOME 如果echo $HOME显示/home/work,则ls $HOME等价于ls /home/work
局部变量
局部变量只对创建它们的shell可见。
set 打印全局变量、局部变量、用户定义变量
设置环境变量
设置局部变量
启动bash shell之后,通过等号进行赋值。用户定义变量无法在子shell中引用,同样的子进程创建的局部变量也无法在父进程中使用,退出子进程之后局部变量不可用。
echo $my_env
my_env=helloworld
echo $my_env
my_env="hello world"
echo $my_env
设置全局变量
如果想要在子进程可用,要创建全局变量,方法:创建一个局部变量,然后导出到全局环境。
my_env=hello
export my_env export命令将局部变量导出到全局环境,成为全局变量,不要加$
bash 进入子shell
echo $my_env 打印hello
exit 退出子shell
echo $my_env 仍然打印hello
bash 进入子shell
echo $my_env 打印hello
my_env=world 在子shell中修改全局变量,仅在子shell中有效,
export my_env 无论是否执行export导出,都不会影响父shell中的全局变量
echo $my_env 打印world
exit 退出子shell
echo $my_env 仍然打印hello,修改子shell中全局变量不会影响到父shell中该变量的值
删除环境变量
echo $my_env
unset my_env 使用unset删除环境变量,不加$
echo $my_env
my_env=hello
export my_env 全局变量my_env值为hello
bash 进入子shell
echo $my_env 子shell中打印hello
unset my_env 子shell中删除my_env
echo $my_env 子shell中打印空
exit 退出子shell
echo $my_env 父shell中仍然打印hello,即子shell中删除全局变量对父shell无效
默认shell环境变量
列表参见:https://blog.csdn.net/henni_719/article/details/53378681
设置PATH环境变量
PATH定义了用于进行命令和程序查找的目录,用冒号分隔。
如果命令/程序的位置不在PATH中,shell无法找到,只能使用绝对路径。解决办法:引用原PATH值,将新目录添加到PATH中
echo $PATH
PATH=$PATH:/home/work/scripts
echo $PATH 打印的PATH值会包含/home/work/scripts,但只在当前有效,一旦退出系统,修改失效
定位系统环境变量——启动文件
bash shell有三种启动方式:登录时的登录shell,非登录时的交互式shell,运行脚本的非交互式shell。每种方式都会在相应的启动文件中查找命令。
登录shell
用户登录Linux系统时,bash shell作为登录shell启动,并从5个启动文件读取命令:
- /etc/profile,系统默认的主启动文件,每个用户登录时都会执行,会迭代/etc/profile.d中的文件。/etc/profile.d目录可以放置特定应用程序的启动文件。也建议用户把新的或修改的全局变量放在profile.d下的.sh文件中。
- $HOME/.bash_profile,HOME目录下的启动文件供用户编辑,在每次启动shell会话时生效
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
交互式shell
交互式shell只检查HOME目录下的.bashrc文件,不访问/etc/profile。
非交互式shell
尝试读取BASH_ENV定义的启动文件。如果没有设置BASH_ENV,子shell还可以继承使用父shell导出过的变量,即全局变量。子shell不能使用父shell设置但未导出的变量。
数组变量(使用不频繁)
如果某个环境变量存储了多个值,该变量就是一个数组变量。括号+空格。
mytest=(one two three four)
echo $mytest 只会显示one,即数组的第一个值
echo ${mytest[2]} 打印出three
echo ${mytest[*]} 使用通配符,打印出one two three four
mytest[2]=six 单独修改索引位置2的值
echo ${mytest[*]} 打印出one two six four
unset mytest 删除整个数组