shell十三问学习笔记(3)

Mar 14, 2017


var=value?export前后差在哪?

设定(set)

在bash中, 你可以用”=”来设定或重新定义变量的内容:
name=value
在设定变量的时候, 得遵守如下规则:

  • 等号左右两边不能使用区隔符号(IFS), 也应避免使用shell的保留字(meta)
  • 变量名称不能使用$符号
  • 变量名称的第一个字母不能是数字
  • 变量名称长度不能超过256
  • 变量名称及变量值大小写是有区别的

如下是一些常见错误:

  • A= B :不能有IFS
  • 1A=B :不能以数字开头
  • $A=B :名称不能有$

如下则是可以接受的设定:

  • A=” B” :IFS被关闭了
  • A1=B :并非以数字开头
  • A=$B :$可用在变量值内
  • This_Is_A_Long_Name=b :可用_连接较长的名称

变量替换

shell之所以强大, 其中的一个因素是它可以在命令行中对变量作替换处理.在命令行中使用者可以使用$符号加上变量秉承(除了在用=定义变量名称之外), 将变量值给替换出来, 再重新组建命令行.
比如:

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

若從技術細節來看,shell 會依據 IFS(Internal Field Seperator) 將 command line 所輸入的文字給拆解為”字段”(word)。 然後再針對特殊字符(meta)先作處理,最後再重組整行 command line 。

这里的$就是command line中最经典的meta之一了, 就是做变量替换的.在日常的shell操作中, 我们常会使用echo命令来查看特定变量的值, 例如:

$ echo $A -$B $C

得到如下结果:

ls -la /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:D
A=$A:E
这样我们可以将变量扩充为B:C:D:E, 但要是没有区隔符的话, 以下这种用法是会出问题的:
A=BCD
A=$AE
这个命令的实际效果是将A的值替换为AE变量的替换结果, 而非$A再加上E!
要解决这个问题, 我们需要使用更谨慎的替换处理:
A=BCD
A=${A}E
如上例所示, 我们使用{}将变量名称的范围明确定义出来.

export

严格来讲, 我们在当前shell定义的变量, 均属于本地变量(local variable), 只有经过export命令的输出处理, 才能成为环境变量(environment variable):

$ A=B
$ export A

$ export A=B

经过export处理后的变量A就能成为一个环境变量供其后的命令使用.


上一篇博客:shell十三问学习笔记(2)
下一篇博客:RBDS(Raspberrypi-Based Distributing System)搭建及配置