美文网首页
Linux 环境变量

Linux 环境变量

作者: Manchangdx | 来源:发表于2018-07-24 12:00 被阅读0次

    一、分类

    按照生命周期分类:

    • 永久的环境变量:分为系统级和用户级,需要手动修改相关配置文件
    • 临时的环境变量:使用 export 命令在终端声明,只在当前终端有效,关闭终端后变量失效

    按照作用域分类:

    • 系统环境变量:对所有用户所有 shell 均有效
    • 用户环境变量:只对某个用户有效
    • shell 环境变量:只在某个 shell 中有效,即临时环境变量

    二、环境变量与自定义变量

    环境变量是相对于进程而言的概念,可以被子进程继承
    启动终端就会启动 shell,shell 就是一个进程,在 shell 里设置的环境变量会被子进程继承。它对当前进程及其子进程有效,对父进程无效

    自定义变量是相对于 shell 中的命令而言的概念,通常后面会接一个命令,这种变量不会被子进程继承。它只对当前进程有效,对父进程和子进程均无效

    上面的各种分类,都是针对环境变量而言

    mcdx@ubuntu:~$ shiyanlou=1  # 自定义变量,只对当前进程有效
    mcdx@ubuntu:~$ set | grep shiyanlou
    shiyanlou=1
    mcdx@ubuntu:~$ env | grep shiyanlou
    mcdx@ubuntu:~$ export | grep shiyanlou
    mcdx@ubuntu:~$ name=world  # 自定义变量
    mcdx@ubuntu:~$ echo hello $name
    hello world
    
    mcdx@ubuntu:~$ export shiyanlou=2  # 环境变量,对当前进程及其子进程均有效
    mcdx@ubuntu:~$ set | grep shiyanlou
    _=shiyanlou
    shiyanlou=2
    mcdx@ubuntu:~$ env | grep shiyanlou
    shiyanlou=2
    mcdx@ubuntu:~$ export | grep shiyanlou
    declare -x shiyanlou="2"
    
    • set 显示当前 shell 中的所有变量,包括自定义变量
    • env 显示与当前用户有关的所有环境变量
    • export 显示的是从 shell 导入到用户环境的变量,也就是从自定义变量变成了用户级环境变量的变量

    三、创建各种变量的命令

    3.1、export 将自定义变量升级为用户级环境变量

    上面说的 export 的显示环境变量的作用,就是源于此
    只要 export 里有的,env 里都有
    这个就不举例了
    

    3.2、read 读取标准输入并将其赋值给自定义变量

    mcdx@ubuntu:~$ read xxx
    world
    mcdx@ubuntu:~$ echo hello $xxx
    hello world
    mcdx@ubuntu:~$ read James Nash  # 一次设置多个
    Leborn Steve
    mcdx@ubuntu:~$ echo $James $Nash 
    Leborn Steve
    

    3.3、declare 定义自定义变量和用户级环境变量

    mcdx@ubuntu:~$ declare Durant=Kevin  # 自定义变量
    mcdx@ubuntu:~$ echo $Durant 
    Kevin
    mcdx@ubuntu:~$ set | grep Durant
    Durant=Kevin
    mcdx@ubuntu:~$ env | grep Durant  # env 是保存用户级环境变量的,显然找不到
    
    mcdx@ubuntu:~$ declare -x Curry=Stephen  # -x 选项定义用户级环境变量
    mcdx@ubuntu:~$ echo $Curry 
    Stephen
    mcdx@ubuntu:~$ set | grep Curry
    Curry=Stephen
    mcdx@ubuntu:~$ env | grep Curry  # 找到了
    Curry=Stephen
    

    四、引用变量

    4.1、引号的使用

    shiyanlou:~/ $ u1=s1                                      
    shiyanlou:~/ $ u2=hello_$u1                          
    shiyanlou:~/ $ echo $u2      
    hello_s1
    shiyanlou:~/ $ u2="hello_$u1_world"     
    shiyanlou:~/ $ echo $u2    
    hello_
    shiyanlou:~/ $ u2="hello_$u1""_world" 
    shiyanlou:~/ $ echo $u2  
    hello_s1_world
    shiyanlou:~/ $ u2='hello_$u1''_world'  
    shiyanlou:~/ $ echo $u2   
    hello_$u1_world
    

    4.2、变量扩展
    引用变量除了使用 $var 格式直接引用变量之外,还可以使用 ${var} 的方式对变量进行扩展。常见的形式如下表:

    表达式 说明
    ${var} 等同于 $var
    ${var:-word} 如果 $var 的变量值为空或未赋值,则返回 word 字符串,防止因变量是空值或未定义而导致异常。
    ${var:=word} 如果 $var 的变量值为空或未赋值,则设置这个变量值为 word,并返回其值。位置变量和状态变量等特殊变量不适用。基本同上一个,但该变量又额外给 $var 变量赋值了。
    ${var:?word} 如果 $var 的变量值为空或未赋值,那么 word 字符串将被作为标准错误输出,否则输出变量的值。用于捕捉由于变量未定义而导致的错误,并退出程序。
    ${var:+word} 如果 $var 的变量值为空或未赋值,则什么都不做,否则返回 word 字符串的值,也就是整个表达式的值为 word 。

    4.3、特殊变量

    bash 中,还有两种特殊的变量,分别为位置变量和状态变量。

    位置变量也叫位置参数,是 bash 脚本执行时写入命令行的参数或选项,会传递给脚本或函数。位置变量为 $n,n 是一个非负的整数,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2,在 n 大于等于 10 的时候,需要使用 ${n}

    mcdx@ubuntu:~$ cat test.sh 
    echo $1 $2
    echo ${12} $12
    mcdx@ubuntu:~$ source test.sh 1 2 3 4 5 6 7 8 9 0 a b c
    1 2
    b 12  # 这个 12 怎么来的呢?$12 相当于 $1 加上 2 
    

    状态变量,见下表:

    变量 含义
    $0 当前脚本的文件名
    $# 传递给脚本或函数的参数数量
    $* 传递给脚本或函数的所有参数
    $? 获取执行上一个指令的执行状态返回值(0 为成功,非零为失败),我们之前已经用到了
    $$ 获取当前执行的 shell 脚本的进程号(PID)
    $! 获取上一个在后台工作的进程的进程号
    $_ 获取在此之前执行的命令或脚本的最后一个参数

    五、删除变量

    mcdx@ubuntu:~$ echo $shiyanlou
    2
    mcdx@ubuntu:~$ unset shiyanlou
    mcdx@ubuntu:~$ echo $shiyanlou
    
    mcdx@ubuntu:~$ 
    

    相关文章

      网友评论

          本文标题:Linux 环境变量

          本文链接:https://www.haomeiwen.com/subject/qlyemftx.html