局部变量和环境变量,局部变量只适用于当前shell,而环境变量是全局的,它适用于所有当前shell以及其派生出来的任意子进程,有些变量是用户创建的,其他的则是专用的shell变量。
局部变量的作用域被限定在创建它们的shell中。local函数可以用来创建局部变量,但仅限于函数内使用。局部变量可以通过简单的赋予它一个值或一个变量名来设置,用declare内置函数来设置,或者省略也可。
格式:
变量名=值
declare 变量名=值
以下来示范一个局部变量的例子:
[root@weivid ~]# echo $$ #shell的ID号
8836
[root@weivid ~]# var=world
[root@weivid ~]# echo $var #打印变量
world
当使用bash重新开启一个子shell时,再次调用var变量,系统会找不到变量的值,例如:
[root@weivid ~]# bash #重新开启一个shell ID号
[root@weivid ~]# echo $$
8920
[root@weivid ~]# echo $var
#没有变量值
[root@weivid ~]#
如果退出子shell时,bash,在重新打印var,又会有原来的值,并且父shell ID号还是原来的bash。
[root@weivid ~]# exit
exit
[root@weivid ~]# echo $$
8836
[root@weivid ~]# echo $var
world
所以,当创建一个子shell时,在父shell中创建的临时变量var,在子shell中无法调用。这里创建的变量var即为局部变量。
此外,还有一点需要说明的是,当开启子shell时,大部分的自己申明的命令都不能使用,必须重新source /home/用户名/.bashrc文件才能重新使用自定义的变量名。
环境变量通常又称全局变量,以区别于局部变量,通常,环境变量应该大写,环境变量是已经用export内置命令导出的变量。子shell继承当前父shell的环境变量,并能一直传承下去,但是不可逆向传递。
格式:
1. export 变量=值
2. declare -x 变量=值
举个例子:
[root@weivid ~]# export PATH_WW=/home/weivid
[root@weivid ~]# echo $PATH_WW
/home/weivid
[root@weivid ~]# echo $$
8836
[root@weivid ~]# bash #创建一个子shell
[root@weivid ~]# echo $$
8958
[root@weivid ~]# echo $PATH_WW #打印全局变量
/home/weivid
当我们在z子shell中创建全局变量时:
[root@weivid ~]# echo $$
8958
[root@weivid ~]# declare -x NAME=”strong_man”
[root@weivid ~]# echo $NAME
strong_man
[root@weivid ~]# exit
exit
[root@weivid ~]# echo $$
8836
[root@weivid ~]# echo $NAME
#打印无,原因,在父shell中没有定义NAME变量,子shell不会传递到父shell中
因此,在父shell中定义的PATH_WW和NAME环境变量传递到了子shell中,在子shell中定义的环境变量没有被带到父shell中。
永久环境变量和临时环境变量
a. 永久的:需要b修改配置文件,export变量永久生效。
b. 临时的:使用export命令行声明即可,变量在关闭shell时失效。
用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量
在终端中打开该路径下的文件:
gvim /etc/profile
添加下面代码,并保存。
export CLASSPATH=/home/weivid/project
注:修改文件后要想马上生效还要**运行 source /etc/profile不然只能在下次重进此用户时生效。**
用VIM在用户目录下的.bashrc文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。
例如:编辑guok用户目录(/home/guok)下的.bashrc
vi /home/guok/.bashrc
添加如下内容:
export CLASSPATH=/home/weivid/project
注:修改文件后要想马上生效还要**运行 source /home/guok/.bash_profile不然只能在下次重进此用户时生效。**
在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。
使用 ${变量名} 的方法可以调用自定义的环境变量名。
例如对于一个设计中,需要添加一个路径中的多个文件。
[root@weivid project1] # ls
1.txt 3.txt 5.txt
2.txt 4.txt 6.txt
[root@weivid project1]pwd'
/home/weivid/linux/file/text/project/projject1
需要在一个文档里把这些的文件的绝对路径全部添加至一个文件中。我们写一个脚本文件:
#/usr/bin/bash
export PATH_TXT=/home/weivid/linux/file/text/project/projject1
ls *.txt > list.txt
sed -i 's,^,${PATH_TXT}/,g' list.txt #将生成文件中的路径替换添加进去,生成新的带有绝对路径的list.txt文件
当然也可以把PATH_TXT的变量声明添加至bash或者csh的环境中。用前面介绍的方法。