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

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. (Java后端 Java web)面试时如何展示自己非技术方面的能力(其实就是综合能力)

    这篇文章的适用范围其实不仅限于Java后端或Java Web,不过其中有些是拿这方面举例的,在其它方面,大家可以举一反三,应该也能得到些启示. 我们在面试时,会发现有些候选人技术不错,比如在Java ...

  2. Ubuntu16.04 install jdk-8u144-linux-x64.tar.gz

    打开终端: Ctrl+Alt+T 下载jdk: wget http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b ...

  3. IDL 数组相关函数

    1.信息获取 Size()函数能够获取数组的相关信息.不设置关键字是,函数返回变量的基本信息:第一个返回值是变量的维数N_dims,但当变量是敞亮或未定义是返回值为0:第二个 到第N_dims+1个返 ...

  4. 让asp.net网站支持多语言,使用资源文件

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs&quo ...

  5. 从字符串获得MAC地址的方法

    今日有感于编程水平下降,特意练习一下,根据MAC地址字符串,获取MAC地址的2种方法. #include <stdio.h> void func1(char *str){ unsigned ...

  6. Scrapy框架--使用cookie

    CookieMiddleware class scrapy.downloadermiddlewares.cookies.CookieMiddlewar 该中间件使得爬取需要cookie(例如使用ses ...

  7. vue.js实例对象+组件树

    vue的实例对象 首先用js的new关键字实例化一个vue el: vue组件或对象装载在页面的位置,可通过id或class或标签名 template: 装载的内容.HTML代码/包含指令或者其他组件 ...

  8. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

  9. 在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML

    在SQL Server中实现关系模型的阶梯到级别3的t -SQL DML 格雷戈里·拉森(Gregory Larsen),2017/08/02(第一次出版:2011 /11/09) 原文链接:http ...

  10. MySQL存储过程/存储过程与自定义函数的区别

    语法: 创建存储过程: CREATE [definer = {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parame ...