首页 理论教育 掌握环境变量与特殊变量

掌握环境变量与特殊变量

时间:2023-11-18 理论教育 版权反馈
【摘要】:前面已经提到过环境变量,例如PS1和PATH等,环境变量名一般使用大写字母。管理员可以设置公共的环境变量,用户可以设置自己账户的环境变量。定义普通变量和环境变量的格式是一样的,都是“变量名=值”。Bash自带了一些特殊的内置变量,简称为Bash特殊变量,它们是后面要讲的Bash内置变量的一部分,见表4-2。表4-2 Bash的特殊变量下面举例讲解几个比较常用的Bash的特殊变量。

掌握环境变量与特殊变量

前面已经提到过环境变量,例如PS1和PATH等,环境变量名一般使用大写字母。运行env或者printenv命令可以显示环境变量,例如:

978-7-111-48202-4-Chapter04-127.jpg

978-7-111-48202-4-Chapter04-128.jpg

上面输出的环境变量列表没有按照字母表排序,并且PS1这个环境变量也不在其列。env与printenv都不是Bash的内置命令,运行Bash的内置命令set,可以看见当前shell的所有的按照字母排序的普通变量、数组、环境变量和函数定义等。命令set的输出较长,运行set|more可以分页查看。

不同的计算机,或同一计算机的不同的账户,环境变量都不完全一样。管理员可以设置公共的环境变量,用户可以设置自己账户的环境变量。

在Linux中定义变量的习惯是:普通变量用小写,环境变量用大写。定义普通变量和环境变量的格式是一样的,都是“变量名=值”。多数情况下,普通变量不需要导出、而环境变量需要导出,所以,也可以认为定义环境变量的格式为:

978-7-111-48202-4-Chapter04-129.jpg

举一个环境变量应用的例子,也是接着2.5节的内容继续讲解。如果code目录放在/tmp目录下,可设置环境变量export CODE_DIR=/tmp;如果放在/home/user目录下,可设置export CODE_DIR=/home/user;如果放在当前账户的主目录下,运行export CODE_DIR=$HOME。那么,脚本A调用脚本C就用${CODE_DIR}/code/driver/cust/C,脚本A调用脚本B就用${CODE_DIR}/code/config/B。运行脚本A之前,把环境变量CODE_DIR的值设置正确即可,无需把脚本A的内容改来改去了。

Bash自带了一些特殊的内置变量,简称为Bash特殊变量,它们是后面要讲的Bash内置变量的一部分,见表4-2。

表4-2 Bash的特殊变量

978-7-111-48202-4-Chapter04-130.jpg

下面举例讲解几个比较常用的Bash的特殊变量。在某个脚本里包含$0时,$0的值就是脚本名字本身:

978-7-111-48202-4-Chapter04-131.jpg

运行脚本env_dollar_0.sh:

978-7-111-48202-4-Chapter04-132.jpg

对于某个脚本而言,$1,$2,$3分别表示脚本的前3个参数,$#表示参数个数,$*和$@都表示所有的参数(但$*和$@不完全一样)。

阅读脚本positional_parameter_1.sh和其运行结果,可以理解表4-2中的$#,$N(N=1,2,3,…),$*和$@的作用。

978-7-111-48202-4-Chapter04-133.jpg(www.xing528.com)

分别输入1个、3个和5个参数,看看其运行结果:

978-7-111-48202-4-Chapter04-134.jpg

从上面的例子看,似乎$*与$@的作用是相同的,其实不然,在讲for循环的时候有相应的例子说明它们的区别。

set命令可以丢弃原来的位置参数并重置位置参数,set--可以清除所有的位置参数。$0不受影响,它始终代表脚本名。看下面的脚本:

978-7-111-48202-4-Chapter04-135.jpg

下面执行脚本positional_parameter_2.sh,给它传递3个参数p1,p2,p3:

978-7-111-48202-4-Chapter04-136.jpg

特殊变量$$表示进程ID。想知道当前shell的进程ID,运行echo$$即可:

978-7-111-48202-4-Chapter04-137.jpg

在某个shell(称为父shell)里面运行一个脚本,脚本的进程ID与其父shell的是不一样的。每次运行同一个脚本,脚本的进程ID都不一样,这是因为脚本里面的命令每次运行在不同的子shell里。例如,脚本env_process_id.sh显示$$的值,每次运行,值都不一样:

978-7-111-48202-4-Chapter04-138.jpg

这里顺便讲解一下两种执行脚本方式的区别。一种方式是直接运行一个可执行脚本,每次运行都会产生一个新子shell,每次会有不同的进程ID,刚才的例子已经说明了这一点;另一种方式是运行source<脚本名>(或者.<脚本名>),这种方式不产生新子shell,而是在当前shell运行脚本中的命令。例如,运行sourceenv_process_id.sh,显示的就是当前shell的进程ID:

978-7-111-48202-4-Chapter04-139.jpg

运行普通脚本,一般采用方式一,而且最好采用方式一,否则可能会破坏当前shell的环境。若要配置当前shell的环境(开发环境、编译环境),即运行一个为当前shell设置环境的脚本的时候,采用方式二。

表4-2中的$-表示当前shell的选项,很多选项可以用set命令设置或查询,见第10章。例如,运行echo$-,如果$-含i表示当前shell为交互(interactive)shell;打开选项noclobber后,$-就包含了C:

978-7-111-48202-4-Chapter04-140.jpg

表4-2中的$?在3.7节已经介绍过了。表4-2还包括其他特殊变量,这里不一一介绍了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈