很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。

6.1 什么是环境变量:

bash shell用一个叫环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息。

这项特性允许在内存中存储数据,以便程序能轻松访问到它们。

在bash shell中,分两类:

全局变量:对于shell会话和所有生成的子shell都是可见的

局部变量:只对创建的它们的shell可见

6.1.1全局环境变量

查看全局变量,  $env    $printenv

查看某个全局变量:$printenv HOME  或者

$echo $PATH   // $后面接变量名。能让变量作为命令行参数

比如:ls  $HOME   相当于 ls  /home/xiaochongyong

6.1.2 局部环境变量

只在定义它们的进程中可见。

可分为:标准的局部变量  和 用户自定义的局部变量

set:显示为某个特定进程设置的所有环境变量(包括全局,标准局部,自定义局部),还会按照字母排序。

6.2 设置自定义变量。大小写敏感的

6.2.1 设置局部自定义变量:尽量用小写

$my_variable=hello

$echo $ my_variable

$my_variable="hello xcy"   // 两个词时这么写,加"" 。=边上还不能有空格

$echo $ my_variable

父shell中写了,子shell不一定能用。反之也是。

6.2.1 设置全局环境变量。

设定全局变量的进程所创建的子进程中,该变量都是可见的。

创建方法:

(1)

$my_variable=hello  // 创建环境变量

$export my_variable  // 导出到全局变量中

(2)export $my_variable=new_hello   // 这样是更改值

子shell无法改到父shell中全局变量的值。只在当前子shell有效。

6.3删除环境变量

$unset my_variable

子shell中删除了,无法反应到父shell中去。

6.4 默认的shell环境变量。

默认情况下,bash shell中会用一些特定的环境变量来定义系统环境。

这些变量在Linux系统上都已经设置好了。

6.5 设置PATH环境变量

PATH:定义了用于进行命令和程序查找的目录。

echo $PATH   目录以冒号隔开。

可以把新的搜索目录添加到现有的PATH环境变量中。比如:

gcc hello.c -o xcy

一般只能 ./xcy   运行

但是加了环境变量之后就可以运行了。

但是切换到别的目录还是不行。除非这么加

对PATH的修改只能持续到退出或重启系统,不能一直持续。

6.6 定位系统环境变量

登入系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这种文件叫做启动文件或环境文件。

bash检查的启动文件取决于启动bash shell 的方式。启动方式有三种:

1.登录shell:登录系统时,bash shell会作为登录shell启动。会从5个启动文件里面读取命令。

(1)/etc/profile  (系统默认主启动文件,系统上每个用户登录都会执行这个启动文件)

(2)HOME/.bash_profile  HOME/.bashrc  HOME/.bash_login  HOME/.profile

这4个是针对用户的,提供一个用户专属的启动文件来定义该用户所用到的环境变量。

大多数Linux发行版只用到这四个文件中的一两个。不一定每个用户都有所有文件。

shell、按照下面的顺序运行第一个被找到的文件,余下的被忽略:

HOME/.bash_profile

HOME/.bash_login

HOME/.profile

注意上面没有HOME/.bashrc  。

HOME/.bashrc  这个文件通常通过其他文件运行。

我的电脑里面只有 HOME/.profile

红色部分表示检查HOME目录是不是有一个.bashrc,如果有就会先执行.bashrc里面的命令

2.交互式shell进程

不是系统登录时启动的,比如在终端下直接运行bash。这个就是交互式shell进程。

这种进程不会访问/etc/profile,只会检查HOME下的.bashrc

.bashrc有两个作用:1.查看/etc目录下通用的bashrc文件、2.为用户提供一个定制自己命令别名和私有脚本函数的地方

3.非交互式shell

系统执行shell脚本时用的就是这种shell。

没有命令行提示符。

bash shell提供BASH_ENV环境变量。当启动非交互式shell时,会检查BASH_ENV来查看要执行的启动文件。如果有,shell会执行里面的命令。这通常包含shell脚本变量设置。

我的电脑没有BASH_ENV值。是如何处理的呢?通过继承父shell的导出过的变量。

比如:父shell是登录shell。在/etc/profile  /etc/profile.d/*.sh  HOME/.bashrc  文件中设置并导出了环境变量,用于执行脚本的子shell能继承这些变量。、

父shell未导出的变量是局部变量,子shell无法继承。

6.6.4 环境变量持久化

对于全局环境变量,/etc/profile 在升级之后就会没有。可以在/etc/profile.d 目录下创建一个.sh结尾的文件,把所有新的或修改过的全局变量放在这个文件中

存储个人永久性bash shell的地方是HOME/.bashrc。

比如之前的给命令取别名,如果放在这里就可以永远使用了。

6.7 数组变量。

环境变量可以是数组(从0开始)。比如:

这个用的很少。

《Linux命令行与shell脚本编程大全》 第六章环境变量的更多相关文章

  1. 《Linux命令行与shell脚本编程大全》23章24章

    第二十三章 使用其他shell bash shell是linux发行版中最广泛使用的shell.但是它并不是唯一的选择,还有其他的shell可以供你选择. 23.1 什么是dash shell 百度百 ...

  2. 《Linux命令行与shell脚本编程大全》第九章 安装软件程序

    包管理系统(PMS):用来进行软件安装.管理和删除的命令行工具 9.1包管理基础 1.主流的Linux发行版都采用了某种形式的包管理系统来控制软件和库的安装 2.PMS用一个数据库来记录:系统上安装了 ...

  3. Linux命令行与shell脚本编程大全.第3版(文字版) 超清文字-非扫描版 [免积分、免登录]

    此处免费下载,无需账号,无需登录,无需积分.收集自互联网,侵权通知删除. 点击下载:Linux命令行与shell脚本编程大全.第3版 (大小:约22M)

  4. 《Linux命令行与shell脚本编程大全 第3版》创建实用的脚本---11

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  5. 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---47

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  6. 《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---57

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  7. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---57

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  8. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---56

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  9. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---55

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  10. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---54

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

随机推荐

  1. JavaWeb(一)之细说Servlet

    前言 其实javaWeb的知识早就学过了,可是因为现在在搞大数据开发,所以web的知识都忘记了.准备开始慢慢的把Web的知识一点一点的回忆起来,多学一点没有关系,就怕到时候要用的话,什么都不会了. 一 ...

  2. JavaScript 版数据结构与算法(二)队列

    今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...

  3. IIS7中JS、CSS、Image无法显示和加载解决方案

    前两天把机器从Windows7升级到Windows10,IIS也跟着升级了,在获取项目搭载IIS上发现原有的页面中所有的JS.CSS.Image都无法访问,提示500错误,起初以为是IIS没有装好 重 ...

  4. Python实战之SocketServer模块

    文章出处:http://www.cnblogs.com/wupeiqi/articles/5040823.html SocketServer内部使用 IO多路复用 以及 "多线程" ...

  5. Java面向对象 String 基本数据类型对象包装类

      Java面向对象  String 知识概要:              (1)String的用法详解 (2)基本数据类型对象包装类 String          顾名思义,该类主要是对字符串 ...

  6. 如何在不同的语言/平台中获取Android ID

    如何在不同的语言/平台中获取Android ID 最近开发工作中需要使用到AndroidID,在Unity和native code中也需要使用,java获取很方便,Unity中也不难,最难的是在nat ...

  7. PE格式第九讲,资源表解析

    PE格式第九讲,资源表解析 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件 ...

  8. ThreadPoolExecutor系列<三、ThreadPoolExecutor 源码解析>

    本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7681826.html 在源码解析前,需要先理清线程池控制的运行状态 ...

  9. 成为一名Java高级工程师你需要学什么

    宏观上: 1.技术广度方面至少要精通多门开源技术吧,研究过struts\spring等的源码.2.项目经验方面从头到尾跟过几个大项目,头是指需求阶段,包括需求调研.尾是指上线交付之后,包括维护阶段.3 ...

  10. JS难点--面向对象(继承)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #a5b2b9 } 继承 让一个对象拥有另一个对象的属性或者 ...