Linux系统中bash shell编程的10个基础问题讲解

2019-09-23 09:20:30王振洲

上例中,我们使用{}将变量名称的范围给明确定义出来,如此一来,我们就可以将A的变量值从BCD给扩充为BCDE。(提示:关于${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的观念,敬请留意。

取消变量
要取消一个变量,在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 #取消
$ var=${str=expr} #定义var
$ echo $var
expr
$ echo $str
expr

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

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

不知,你选哪个呢?….^_^ 嗯... 好吧,我就解釋一下 var=${str=expr} :

首先,var=$str 這個大家都可理解吧。而接下來的思考方向是,究竟 $str 這個變量是如下哪一種情況呢:

unset null not null

假如是 unset ,那麼 var=${str=expr} 的結果將是: