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

这次让我们暂时丢开command line, 先了解一下bash变量(variable)吧...

所谓的变量,就是利用一个固定的"名称"(name), 来存取一段可以变化的"值"(value)。
变量设定(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 #可用_连接较长的名称或值,且有大小区别;

变量替换(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}事实上还可以做到更多的变量处理能力, 这些均属于比较进阶阶段的变量处理,现阶段暂不介绍了, 请大家自行参考资料。

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(进程)的角度来理解才能透彻。 我们将于下一章为大家说明process(进程)的概念,敬请留意。
取消变量(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

聪明的读者(yes, you!),稍加思考的话, 应该不难发现为何同样的var=${str=expr} 在str为null与unset之下的不同吧? 若你看不出来,那可能是如下原因之一:

你太笨了
不了解 var=${str=expr} 这个进阶处理
对本篇说明还没有来得及消化吸收
我讲得不好

不知,您选哪个呢?...... _.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,370评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,723评论 0 10
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,981评论 0 13
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,722评论 3 70
  • 1、bash 与 shell 管理整个计算机硬件的其实是操作系统的内核(Kernel),这个内核是需要被保护的,所...
    Zhang21阅读 847评论 0 2