shell的变量功能(一)

什么是变量?

变量是一个存储位置和一个关联的符号名字,这个存储位置包含了一些已知或未知的量或者信息,即值。在C语言里,变量是如下三方面的统一体:

  1. 名字(运行时会变成数字化的名字,内存地址)
  2. 存储位置(某一位置开始的一定大小的存储空间)
  3. 该存储位置里内容的解释方式(即类型,整数、浮点数还是字符串?)

任意一部分单独都不是变量。当我们给一个变量a赋值另一个值时,改变的是a对应的存储位置里的内容,赋值前后是同一个a,因为1、2、3都没有变。

变量的显示

变量的设置规则

  1. 变量与变量内容以一个等号“=”来连接;
  2. 等号两边不能直接接空格符;
  3. shell中所有变量都定义为字符串,且变量名称只能是英文字母与数字,但是数字不能是开头字符;
  4. 若有空格符可以使用双引号  ”  或单引号  ‘  来将变量内容结合起来,但须要特别留意, 双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;
  5. 必要时需要以转意字符   \   来将特殊符号 ( 如 Enter, $, \, 空格符, ‘ 等 ) 变成一般符号;
  6. 在一串指令中,还需要借由 其它的shell指令 提供的信息,可以使用   ` command`  (特别特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号!) 或则$(命令) 。
  7. 若该变量需要扩增变量内容时,则需以双引号及 $变量名称 如: “$PATH”:/home  继续累加内容;
  8. 若该变量需要在其它子程序执行,则需要以  export  来使变量变成环境变量,例如:

#export  PATH

  1. 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断 ( 纯粹依照使用者兴趣与嗜好 ) 。
  2. 取消变量的方法为: unset  变量名称。例如:

#unset   myname

环境变量

在所有 Unix类Unix系统中, 每个进程都有其各自的环境变量设置。 缺省情况下, 当一个进程被创建时, 除了创建过程中的明确更改外,它继承了其父进程的绝大部分环境设置。 在API层级上, 使用fork和exec函数进行变量设置。或利用bashshell文件, 使用特殊的命令调用来改变环境变量:通过env 间接替代或者使用ENVIRONMENT_VARIABLE=VALUE <command> 标识. 所有的Unix操作系统 以及DOSMicrosoft Windows 都是用环境变量,但是它们使用不同的环境变量名称。我们可以通过运行程序来访问环境变量的值。环境变量的例子包括:

Shell 脚本 和 批处理文件 使用环境变量来存储临时值,用于以后在脚本中引用,也用于传递数据和参数给子进程。 在Unix系统中,一个在脚本或程序中更改的环境变量值只会影响该进程,亦可能影响其子进程。其父进程和无关进程将不受影响。在DOS中,更改或删除一个批处理文件中的环境变量值将改变变量的期限命令的存在。

在Unix系统通过初始化脚本启动时,环境变量通常会在此时被初始化,因此会被系统中的其它进程所继承。用户可以而且经常添加环境变量到他们使用的shell脚本中。 在Windows系统中,环境变量的缺省值存储在 windows 注册表 中,或者在 autoexec.bat 自动执行的批处理文件中设置。(来自维基百科)

Linux是一个多用户多任务的操作系统,可以在Linux中为不同的用户设置不同的运行环境,具体做法是设置不同用户的环境变量。

Linux环境变量分类

一、按照生命周期来分,Linux环境变量可以分为两类:
1、永久的:需要用户修改相关的配置文件,变量永久生效。
2、临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。

二、按照作用域来分,Linux环境变量可以分为:
1、系统环境变量:系统环境变量对该系统中所有用户都有效。
2、用户环境变量:顾名思义,这种类型的环境变量只对特定的用户有效。

Linux设置环境变量的方法

一、在/etc/profile文件中添加变量 对所有用户生效(永久的)
用vim在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。
例如:编辑/etc/profile文件,添加CLASSPATH变量

vim /etc/profile

export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

注:修改文件后要想马上生效还要运行source /etc/profile不然只能在下次重进此用户时生效。
二、在用户目录下的.bash_profile文件中增加变量 【对单一用户生效(永久的)】
用vim ~/.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。

vim ~/.bash.profile

export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

注:修改文件后要想马上生效还要运行$ source ~/.bash_profile不然只能在下次重进此用户时生效。
三、直接运行export命令定义变量 【只对当前shell(BASH)有效(临时的)】
在shell的命令行下直接使用export 变量名=变量值
定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

(原文:http://www.jianshu.com/p/ac2bc0ad3d74

变量的有效范围

变量也有使用的“范围”?在export命令说明中,就提到了这个概念。如果在跑程序的时候,有父进程与子进程的不同程序关系时,则“变量”可否被引用与export有关。被export后的变量,我们可以称它为“环境变量”。环境变量可以被子进程所引用,但是其他的自定义变量内容就不会存在于子进程中。

  • 在某些不同的书籍中会谈到“全局变量”(global variable)与“局部变量”(local variable)。基本上可以这样区分:环境变量=全局变量   自定义变量=局部变量

为什么环境变量的数据可以被子进程所引用?这是因为内存配置的关系。理论上是这样的:

  • 当启动一个shell,操作系统会分配一记忆块给shell使用,此内存内的变量可让子进程取用;
  • 若在父进程利用export功能,可以让自定义变量的内容写到上述的记忆块当中(环境变量);
  • 当加载另一个shell时(即启动子进程,而离开原本的父进程了),子shell可以将父shell的环境变量所在的记忆块导入自己的环境变量块当中。

通过这样的关系,我们就可以让某些变量在相关的进程之间存在,以帮助自己更方便地操作环境。不过要提醒的是,这个“环境变量”与“bash的操作环境”意思不太一样,举例来说,PS1并不是环境变量,但是这个PS1会影响到bash的接口(提示符)。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *