Linux环境变量

一、全局环境变量

  1. 全局环境变量对于所有shell会话和生成的子shell都是可见。
  2. 查看所有全局变量env
  3. 查看某个全局变量printenv HISTSIZE
  4. 创建全局变量
    • 先创建局部变量my_variable="ouyang"
    • 然后export my_variable
  5. 父shell 创建全局环境变量,子shell能够得到,但是修改无效。子shell创建全局环境变量,父shell不能得到。

二、局部环境变量

  1. 局部变量只对创建的shell可见。
  2. set查看为某个特定进程设置的所有环境变量:局部+全局
  3. 局部环境变量,子shell不能使用。
  4. 子shell定义的局部变量,父shell不能使用。

三、用户自定义变量

  1. 设置局部用户自定义变量my_variable=hello,不要加空格。
  2. 规范:系统环境变量名使用大写字母,用户自定义使用小写字母。

四、删除环境变量

  1. unset my_variable
  2. 同样,在子shell中删除了环境变量,不能影响到父shell

五、默认的环境变量

  1. BASH 当前shell实例的全路径名
  2. PATH shell查找命令的目录列表,由冒号分隔
    • 增加path:PATH=$PATH:/mypath,注意不要漏了冒号
  3. PWD 当前工作目录

六、设置系统环境变量

6.1 登录shell

  1. /etc/profile
  2. $HOME/.bash_profile
  3. $HOME/.bashrc
  4. $HOME/.bash_login
  5. $HOME/.profile
  6. shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略:
    • $HOME/.bash_profile
      • .bash_profile启动文件会先去检查HOME目录中是不是还有一个叫.bashrc的启动文件。如果有的话,会先执行启动文件里面的命令。
    • $HOME/.bash_login
    • $HOME/.profile
    • 注意,这个列表中并没有$HOME/.bashrc文件。这是因为该文件通常通过其他文件运行的。

6.2 交互式shell进程

  1. 如果bash不是登录系统时启动的,比如在命令行敲bash启动,那么就叫做交互式shell
  2. 如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

6.3 非交互式shell

  1. 系统执行shell脚本时用的就是这种shell。
    • 执行脚本,有时候是开启子shell,有时候是在本shell
  2. bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。

6.4 环境变量持久化

  1. 全局环境变量
    • 将新的或修改过的变量放在/etc/profile文件中,但是如果升级了发行版,这个文件也会被更新。
    • 可以在/etc/profile.d中创建一个以.sh结尾的文件。把所有新的或修改过的全局环境变量设置在这个文件中。
      • /etc/profile 文件在被 Shell 处理时,会自动加载 /etc/profile.d 目录下所有以 .sh 结尾的文件。因此,只需将变量配置文件放入该目录,便会自动生效,无需显式修改 /etc/profile 文件。

七、数组变量

  1. 要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。mytest=(one two three four five)

  2. 要引用一个单独的数组元素,就必须用代表它在数组中位置的数值索引值。索引值要用方括号括起来。echo ${mytest[2]}

  3. 要显示整个数组变量,可用星号作为通配符放在索引值的位置。echo ${mytest[*]}

  4. 删除某个索引位置的值

    $ unset mytest[2]
    $
    $ echo ${mytest[*]}
    one two four five
    $
    $ echo ${mytest[2]}
    $ echo ${mytest[3]}
    four
    
    
    • 其实没有真正“删除”,该位置为null了,所以打印全部的时候,2索引似乎“消失”了。但是单独打印2索引时,其实是null
posted @ 2024-11-20 21:09  ouyangxx  阅读(3)  评论(0编辑  收藏  举报