一、分类
按照生命周期分类:
- 永久的环境变量:分为系统级和用户级,需要手动修改相关配置文件
- 临时的环境变量:使用
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:~$
网友评论