Linux 环境变量

一、分类

按照生命周期分类:

  • 永久的环境变量:分为系统级和用户级,需要手动修改相关配置文件
  • 临时的环境变量:使用 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:~$ 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。