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

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

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

$ A=ls
$ B=la
$ C=/tmp
$ $A -$B $C

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

必需强调的是,我们所提的变量替换,只发生在command line上面。(是的,让我们再回到command line吧﹗)仔细分析最后那行command line,不难发现在被执行之前(在输入CR字符之前),
$符号会对每一个变量作替换处理(将变量值替换出来再重组命令行),最后会得出如下命令行:

ls -la /tmp

还记得第二章我请大家“务必理解”的那两句吗?若你忘了,那我这里再重贴一遍:
若从技术细节来看,shell会依据IFS(Internal Field Seperator)将command line所输入的文字给拆解为“字段”(word)。然后再针对特殊字符(meta)先作处理,最后再重组整行command line。这里的$就是command line中最经典的meta之一了,就是作变量替换的﹗

在日常的shell操作中,我们常会使用echo命令来查看特定变量的值,例如:

$ echo $A -$B $C

我们已学过,echo命令只单纯将其argument送至“标准输出”(STDOUT,通常是我们的荧幕)。所以上面的命令会在荧幕上得到如下结果:

ls -la /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,它们的值分别是B与C。

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

当我们在设定变量的时侯,请记着这点:用一个名称储存一个数值,仅此而已。此外,我们也可利用命令行的变量替换能力来“扩充”(append)变量值:

A=B:C:D
A=$A:E

这样,第一行我们设定A的值为“B:C:D”,然后,第二行再将值扩充为“B:C:D:E”。
上面的扩充示例,我们使用区隔符号(:)来达到扩充目的,要是没有区隔符号的话,如下是有问题的:

A=BCD
A=$AE

因为第二次是将A的值继承$AE的提换结果,而非$A再加E!要解决此问题,我们可用更严谨的替换处理:

A=BCD
A=${A}E