一、有限状态机(Finite State Machine,FSM)是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用。FSM一个常见的应用就是用来负责Parser复杂的数据结构,比如解释URI协议(uri-rfc239、uri-rfc3986)(注释:统一资源标识符(Uniform Resource Identifier,或URI)),在这里以Linux下shell命令字符串解释为列子,说明FSM的应用。
二、简单介绍shell中的各种符号应用
1、shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。(注意是所有,只是单引号本身不能够出现在其中)。
2、双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
加变量名可以取变量的值反引号仍表示命令替换,转字符escape$表示的字面值
`表示`的字面值
\”表示”的字面值
\表示\的字面值
除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。
双引号还有一个作用,引用的字符串包含空格的时候,可以用双引号括起来。
3、环境变量,使用(美元符号)作为前缀,比如USER, HOME,有时候为了区分环境变量后面紧跟的字符串,还可以使用{USER},${HOME}形式引用环境变量。
三、基于以上认识,设计了下面的状态图,系统初始状态是TEXT状态,其中ESC是ESCAPE,表示转义字符状态,举个列子,提供shell字符串cmdline,逐个每个输入的字符,如果遇到输入进来的字符是 \ 表示进入ESC状态,在ESC状态输入任何字符立即进入TEXT状态。在看,TEXT状态,如果输入的字符是$,系统进入VAR环境变量状态,再接下来如果是 { 字符, 系统进入 VARNAME2 状态,否则进入 VARNAME状态。待系统遍历完所有的cmdline上的字符,就完成了shell 命令的解释(parser)工作。
四、上代码
这里写代码片