问var=value 在export前后的差在哪?

这次让我们暂时丢开command line,

先了解一下bash变量(variable)吧…

所谓的变量,就是利用一个固定的”名称”(name),

来存取一段可以变化的”值”(value)。

1. 变量设定(set)

在bash中, 你可以用”=”来设定或者重新定义变量的内容:name=value

在设定变量的时候,得遵守如下规则:

等号左右两边不能使用分隔符号(IFS),也应避免使用shell的保留元字符(meta charactor);

变量的名称(name)不能使用$符号;

变量的名称(name)的首字符不能是数字(number)。

变量的名称(name)的长度不可超过256个字符。

变量的名称(name)及变量的值的大小写是有区别的、敏感的(case sensitive,)

如下是一些变量设定时常见的错误:A= B #=号前后不能有IFS

1A=B #变量名称不能以数字开头

$A=B #变量的名称里有$

a=B #这跟a=b是不同的,(这不是错误,提醒windows用户)

如下则是可以接受的设定:A=" B" #IFS被关闭,参考前面的quoting章节

A1=B #并非以数字开头

A=$B #$可用在变量的值内

This_Is_A_Long_Name=b #可用_连接较长的名称或值,且有大小区别;

2. 变量替换(substitution)

shell 之所以强大,其中的一个因素是它可以在命令行中对变量作

替换(substitution)处理。

在命令行中使用者可以使用$符号加上变量名称(除了用=定义变量名称之外),

将变量值给替换出来,然后再重新组建命令行。

比方:$ A=ls

$ B=la

$ C=/tmp

$ $A -$B $C

以上命令行的第一个$是shell prompt, 并不在命令行之内。

必须强调的是,我们所提的变量替换,只发生在command line上面。

(是的,请让我们再次回到命令行吧!) 仔细分析,最后那行

command line,不难发现在被执行前(在输入CR字符之前),

$符号对每一个变量作替换处理(将变量的值替换出来再重组命令行),

最后会得出如下命令行:ls -la /tmp

Note:

若从技术的细节来看,shell会依据IFS(Internal Field Seperator)

将command line所输入的文字拆解为”字段”(word/field)。

然后再针对特殊字符(meta)先作处理,最后重组整行command line。

这里的$就是command line中最经典的meta之一了,

就是作变量替换的。在日常的shell操作中,

我们常会使用echo命令来查看特定的变量的值,

例如:$ echo $A -$B $C

echo命令只单纯将其argument送至”标准输出”(stdout, 通常是我们的屏幕)。

所以上面的命令会在屏幕上得到如下结果:ls -al /tmp

这是由于echo命令在执行时,会先将$A (ls)、$B (la)跟$C (/tmp)给替换出来;

利用shell对变量的替换处理能力,我们在设定变量时就更为灵活了:A=B

B=$A

这样,B的变量值就可继承A变量”当时”的变量值了。

不过,不要以”数学逻辑”来套用变量的设定,比方说:A=B

B=C

这样,并不会让A的变量值变成C。再如:A=B

B=$A

A=C

同样也不会让B的值变成C。

上面是单纯定义了两个不同名称的变量:

A 与 B, 它们的取值分别是C与B。

若变量被重复定义的话,则原有值为新值所取代。(这不正是”可变的量”吗?^_^)

当我们在设定变量的时候,请记住这点:用一个名称存储一个数值, 仅此而已。

此外, 我们也可以利用命令行的变量替换能力来”扩充”(append)变量的值:A=B:C:D

A=$A:E

这样, 第一行我们设定A的值为”B:C:D”,

然后,第二行再将值扩充为”B:C:D:E”。

上面的扩充的范例,我们使用分隔符号(:)来达到扩充的目的,

要是没有分隔符的话,如下是有问题的:A=BCD

B=$AE

因为第二次是将A的值继承$AE的替换结果,而非$A再加E。

要解决此问题,我们可用更严谨的替换处理:A=BCD

A=${A}E

上例中,我们使用{}将变量名称范围给明确定义出来,

如此一来, 我们就可以将A的变量值从BCD给扩充为BCDE。

Tips:

关于${name}事实上还可以做到更多的变量处理能力,

这些均属于比较进阶阶段的变量处理,现阶段暂不介绍了,

请大家自行参考资料。

3. export 变量

严格来说,我们在当前shell中所定义的变量,均属于

“本地变量”(local variable), 只有经过export命令的

“输出”处理,才能成为”环境变量”(environment variable):$ A=B

$ export A

或者$ export A=B

经过export输出处理之后,变量A就能成为一个环境变量

供其后的命令使用。在使用export的时候,请别忘记

shell在命令行对变量的”替换”(substitution)处理。

比方说:$ A=B

$ B=C

$ export $A

上面的命令并未将A输出为”环境变量”,而是将B导出

这是因为在这个命令行中,$A会首先被替换为B,然后在”塞回”

作export的参数。

要理解这个export,事实上需要从process(进程)的角度来理解才能透彻。

4. 取消变量(unset)

要取消一个变量,在bash中可使用unset命令来处理:unset A

与export一样,unset命令行,也同样会作

变量替换(这其实是shell的功能之一),

因此:$ A=B

$ B=C

$ unset $A

事实上,所取消的是变量B而不是A。

此外,变量一旦经过unset取消之后,

其结果是将整个变量拿掉,而不是取消变量的值。

如下两行其实是很不一样的:$ A=

$ unset A

第一行只是将变量A设定为”空值”(null value),

但第二行则是让变量A不存在。

虽然用眼睛来看,

这两种变量的状态在如下的命令结果中都是一样的:$ A=

$ echo $A

$ unset A

$ echo $A

大家务必能识别null value 与 unset的本质区别,

这在一些进阶的变量处理上是很严格的。

比方说:$ str= #设为null

$ var=${str=expr} #定义var

$ echo $var

$ echo $str

$ unset str #取消str

$ var=${str=expr} #定义var

$ echo $var

expr

$ echo $str

expr

linux脚本变量,shell脚本变量的使用相关推荐

  1. linux shell脚本 定义变量,Shell脚本应用 - 编制shell脚本、shell变量

    随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要.在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分.作为Linux系统 ...

  2. linux之基础shell脚本编程1 基础变量赋值

    本章主要介绍函数的基础,变量赋值,逻辑运算,条件表达式,测试 linux之基础shell脚本编程1  基础变量赋值 linux之基础shell脚本编程2 if语句循环判断 linux之基础shell脚 ...

  3. Linux中执行shell脚本的4种方法

    这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下. bash shell 脚本的方法有多种,现在作个小结.假设我们编写 ...

  4. linux 定时执行搅拌,Linux上定时shell脚本

    本文主要介绍在Linux系统上部署定时器,定时执行shell脚本,通过脚本执行sql文件 sql文件 -- 创建表 create table if not exists iot_test.iot_ta ...

  5. Linux中执行shell脚本的5种方法总结

    Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法: 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: c ...

  6. linux中利用shell脚本条件执行linux命令

    linux中利用shell脚本条件执行命令 在linux环境中,我们总会有一些命令需要经常用,例如经常跳转到某些目录下或者执行某些命令,输入一连串的命令是很烦的,此时我们可以预先写一些脚本然后根据我们 ...

  7. kettle脚本Linux执行,kettle在linux下面用于shell脚本执行:转换或者作业

    1 将windows下面创建好的转换,放到Linux某一个文件夹下面.如:把0816_em.ktr文件放到/home/cfj/kettle/testdemo下面. 注意里面的数据库用户名和密码可能需要 ...

  8. linux下的shell脚本

    linux下的shell脚本 一.Shell概述 二.Shell 解析器 三.Shell脚本入门 1. 脚本格式 2. 第一个Shell脚本:helloworld 3. 第二个Shell脚本:多命令处 ...

  9. 猿来小课Linux教程分享Shell脚本问题大全

    本篇文章猿来小课Linux老师给小伙伴们整理了一些Shell脚本问题,对Shell脚本问题有不清楚或者不明白的小伙伴就随猿来来了解一下吧. 猿来小课Linux教程分享Shell脚本问题大全: 1.&a ...

  10. Linux嵌入式开发——shell脚本

    文章目录 Linux嵌入式开发--shell脚本 一.shell脚本基本原则 二.shell脚本语法 2.1.编写shell脚本 2.2.交互式shell脚本 2.3.shell脚本的数值计算 2.4 ...

最新文章

  1. linux nginx svn 安装
  2. u-boot编译过程分析
  3. Application log handling when maintaining product sales area data COM_PRWB_SET_LOGSETTYPE
  4. 用ul li实现边框重合并附带鼠标经过效果
  5. 189. 旋转数组 golang
  6. leetcode 191. 位1的个数(位运算)
  7. 学习笔记13-C语言-字符串函数、缓冲区
  8. MyBatis-Plus_快速入门0222
  9. 信息学奥赛一本通 1312:【例3.4】昆虫繁殖
  10. java存储数据_Java 数据存储
  11. 分布式搜索elasticsearch 索引文档的增删改查 入门
  12. 在php中isset什么意思,php – isset()和__isset()之间有什么区别?
  13. opendrive坐标系
  14. 自然语言处理(一)——中英文分词
  15. e4a 安卓获取ROOT权限的方法思路 转载
  16. 如何租用虚拟服务器,怎么租用虚拟主机
  17. 【微信小程序】选择器组件picker
  18. 【python】pygame实现植物大战僵尸小游戏(附源码 有注释)
  19. 基于web的家庭理财系统
  20. oracle计算两行差值

热门文章

  1. 电子电气架构——车载总线CAN FD应用介绍
  2. 资料分享 | 第十三届GOPS 全球运维大会
  3. Scrapy爬虫实战(三)----------使用cookies爬取51job
  4. 初学C语言入门必读~
  5. 论文笔记(综述)——Image fusion meets deep learning: A survey and perspective
  6. 不能忘却的记忆——水源垃圾史
  7. 阿加内存管理 初始化(八) 至kswapd_init
  8. python数值积分_Python求解数值积分
  9. Android培训班 1
  10. Android培训班(20)