AE工具开发指引
第1章 AE简介
AE是一款轻量级项目管理工具,AE来源于英文 “AUTO EASY”,通过AE能让我们的工作实现 “自动化,简单化”。AE提供了一套文件管理解决方案,可以帮助我们管理所有文本信息。AE同时提供了一套脚本管理方案,能够帮助我们快速生成迭代各种脚本。通过这两个功能的相互配合,我们能够"简化"我们的工作流程,实现工作的"自动化"。
AE本质上就是一个[.sh]脚本程序,程序全名[autoeasy.sh]。我们只需要给该脚本建立一个名叫[ae]的全局连接,就可以在系统的任何位置使用该工具了。
1.1 AE安装部署
目前AE只开发了unix版本,可按照如下步骤安装该工具。
1. 下载工具源码
管理员需要下载[autoeasy.sh]和[autoeasy.txt]两个文件,然后将其拷贝到自己的私人目录。通过过指令[chmod u+x autoeasy.sh],赋予脚本可执行权限。开发工具源码及相关文档已分享到git [https://github.com/sukin1986/ae.git]1
2. 修改管理员IP和目录
通过指令[vi autoeasy.sh]打开脚本程序,按照提示修改管理员[IP]为个人主机IP,修改管理员目录为当前目录,然后保存退出。
3. 建立全局连接
我们有两种方法创建脚本的全局连接,一个是自动一个是手动。自动创建全局连接,需要在工具的安装目录运行指令[autoeasy.sh z aeln sh]。手动创建则需要自己在系统的[bin]目录或者[shbin]目录>通过[ln -s autoeasy.sh ae]指令建立脚本的全局链接。其中autoeasy.sh必须使用全路径文件名。
4. 检测是否安装成功
做完以上三个步骤,然后进入系统的任何目录执行指令[ae],如果看到工具"使用指引"信息,则说明安装成功。
1.2 AE用户信息注册
AE提供的是一个多人协同工作环境,如果想使用AE就必须注册为AE用户。通过运行指令[ae]查看工具使用指引,按照指引输入除[user]外的任意参数即可进入注册流程,最后按照提示输入个人信息完成注
册。
注册需提供的个人信息包括英文名(拼音名),密码(6位数字),手机号(11位数字),个人工作目录。其中英文名不少于2个字符,一般使用个人姓名的全拼或者名字的首字母组合。密码必须为6位数字,不能出现其他类型字符。手机号必须为11位数字,最好使用真实的手机号,方便其他人跟自己联系。个人工作目录必须是全路径目录名,可以是已经存在的目录名,也可以是可以通过[mkdir]命令直接创建的目录名。个人工作目录一般指定为个人私人目录下的[autoeasy]目录,这样可以把工具文件跟其他文件分开管理。
下面指令展示了用户的详细注册流程:
~ mac126$ ae user new
注册新用户:
--------------------------------------------------------------------------------
please input your name:jim
please input your password(use six digit):123456
please input your phone no(use eleven digit):13533440001
please input your priv work dir(eg:/Users/mac126/priv/jim/autoeasy):/Users/mac126/priv/jim/autoeasy
--------------------------------------------------------------------------------
regin success!you can use it by login in!
~ mac126$ ae user jim
2020.01.15.0001 202001150001 jim xxxxxx 13533440001 /Users/mac126/priv/jim/autoeasy
~ mac126$ ae whoami
jim
~ mac126$ ae home
/Users/mac126/priv/jim/autoeasy
~ mac126$
用户注册完毕工具会自动将用户的注册信息保存起来,用户以后就可以直接使用工具的所有指令了。用户注册完成运行指令[ae user self],可以查看到个人注册信息。运行指令[ae tool]可以看到工具>的全路径文件名,运行指令[ae z]可以看到工具库文件的全路径文件名。
1.3 AE用户信息修改
工具提供了[modify]指令,帮助用户修改个人注册信息。已注册用户运行指令[ae user modify]按照提示修改个人注册信息,其过程跟注册流程基本相同。如果用户修改个人的工作目录,则系统会将旧工
作目录的个人文件拷贝到新的工作目录,不会造成个人文件的丢失。
下面展示了用户个人信息修改流程:
~ mac126$ ae user self
2020.01.15.0001 202001150001 jim xxxxxx 13533440001 /Users/mac126/priv/jim/autoeasy
~ mac126$ ae user modify
用户信息修改:
--------------------------------------------------------------------------------
old info:
name :jim
password:123456
phone :13533440001
workdir :/Users/mac126/priv/jim/autoeasy
--------------------------------------------------------------------------------
please input your name:jim
please input your password(use six digit):123456
please input your phone no(use eleven digit):12533440001
please input your priv work dir(eg:/Users/mac126/priv/jim/autoeasy):/Users/mac126/priv/jim/autoeasy
--------------------------------------------------------------------------------
modify success!you can use this tool now!
~ mac126$
1.4 AE使用指引
AE工具使用非常简单,用户可通过工具"使用指引"或者查看"帮助手册"快速熟悉工具指令。用户运行指令[ae]即可调出AE工具"使用指引",使用指引展示了工具的常用命令,每个命令后面都带上了改命令在帮助手册中的"链接"。通过运行该"链接"指令,用户可查看该命令的详细用法。
指令的详细用法都是通过[help]命令调出,工具在收到用户的[help]指令时,会自动查找"帮助手册",然后将详细用法打印在屏幕。例如用户输入[ae help user]命令,就可以直接查看[user]命令的详细>用法。
下图即通过[ae]指令调出的使用指引信息:
~ mac126$ ae
ae工具使用指引:(首次使用带除user以外的任何参数则会进入注册流程)
--------------------------------------------------------------------------------
ae user :用户信息管理 |详细用法:[ae help user ]
ae home :查看个人工作目录 |详细用法:[ae help home ]
ae bak :用户文件备份 |详细用法:[ae help bak ]
ae tool :查看ae工具的全路径文件名|详细用法:[ae help tool ]
ae toolmode :查看ae工具的安装模式 |详细用法:[ae help toolmode] -- new
ae usemode :查看ae指令的运行模式 |详细用法:[ae help tooluse ] -- new
ae whoami :查看当前用具指令的调用者|详细用法:[ae help whoami ]
ae uname :查看ae工具系统名 |详细用法:[ae help uname ]
ae load :分享或者下载标签(应用) |详细用法:[ae help load ]
--------------------------------------------------------------------------------
ae s :查看聊件全路径 |详细用法:[ae help file ]
ae s type :查看文件类型 |详细用法:[ae help type ]
ae s vi :用vi编辑器打开文件 |详细用法:[ae help vi ]
ae s view :用view编辑器打开文件 |详细用法:[ae help view ]
ae s trun :清空文件 |详细用法:[ae help trun ]
ae s ord :让文件内容按域对齐 |详细用法:[ae help ord ]
ae s echo :输出文件反向镜像脚本 |详细用法:[ae help echo ]
ae s cat :查看文件内容 |详细用法:[ae help cat ]
ae s cal :计算s文件中所有数字之和 |详细用法:[ae help cal ]
ae s sh :执行文件文本 |详细用法:[ae help sh ]
ae s d :文件拷贝(s<--d) |详细用法:[ae help cp ]
ae s d diff :比较两个临时文件文本异同|详细用法:[ae help diff ]
ae b label :将标签内容提取到s文件 |详细用法:[ae help label ]
ae b s :将标签内容保存到库文件 |详细用法:[ae help label ]
ae b lab del:删除指定标签 |详细用法:[ae help label ]
ae b lab sh :执行库文件标签脚本 |详细用法:[ae help sh ]
ae b lab pg :查看指定标签的子标签 |详细用法:[ae help pg ]
--------------------------------------------------------------------------------
ae para 1 1 :获取动态参数 |详细用法:[ae help para ]
--------------------------------------------------------------------------------
ae 0 format :字符串格式化处理 |详细用法:[ae help format ]
ae 1 format :字符串格式化处理 |详细用法:[ae help format ]
ae 0 cal :计算s文件中所有数字之和 |详细用法:[ae help cal ]
ae 1 cal :计算s文件第1列数字之和 |详细用法:[ae help cal ]
--------------------------------------------------------------------------------
ae sql sqlstr:[sql]运行数据库语句 |详细用法:[ae help sql ]
ae sql tbname:[sql]查询表结构信息 |详细用法:[ae help sql ]
ae cal 1+1 :计算数学表达式 |详细用法:[ae help cal ]
--------------------------------------------------------------------------------
~ mac126$
1.5 AE版hello world
这节通过一个最简单的例子,展示工具的最基本用法和功能。
通过AE将一个hello world脚本使用hello标签存放在b库文件,然后查询运行该hello标签脚本具体操作如下:
1清空s文件
[ae s trun]
2 编辑s文件
[ae s vi]
#:hello:sh:打印hello world的脚本
echo "hello world!"
编辑完成wq保存退出s临时文件
3 将hello标签保存到b文件
[ae b s]
4 查看b库文件的hello标签内容
[ae b hello]
#:hello:sh:打印hello world的脚本
echo "hello world!"
AE会将标签内容打印在屏幕
5运行hello脚本
[ae b hello sh]
’
hello world!
看到屏幕上输出[hello world!]则表示运行成功!
第2章 AE文件系统
2.1 AE文件系统介绍
AE具有完善的文件系统,AE文件系统由工具文件,用户文件和系统镜像文件三部分组成。
1.镜像文件
镜像文件由工具自己使用,是隐藏文件,外界无法直接访问。查看镜像文件可以通过命令[cd $(ae home)]进入个人工作目录,然后通过命令[ls -a]查看镜像文件详情。
2.工具文件
工具文件由管理员进行统一管理,工具文件存放所有用户的共用信息, 工具文件用英文字母[z]表示。查看工具文件可以通过命令[cd $(ae toolhome)]进入到工具安装目录,然后通过[ls -lrt autoeasy.txt]查看文件详情。
3.用户文件
用户文件是每个注册用户独立使用的文件,用[sadgcpbf]这几个单英文字母表示。用户文件对用户来说具有全局属性,用户可以在系统的任意位置通过文件名来查看和使用文件。例如通过[ae s]命令,可>以查看到[s]文件的全路径文件名。
2.2 AE文件总体结构图
下图展示了工具整个文件系统结构图,每个文件都有自己的用法。其中镜像文件都是隐藏文本,这些文件只被[autoeasy.sh]本身使用。工具文件只被工具管理员使用,其他用户只可读取该文件但没有权>限修改该文件。用户文件是每个用户最常接触到的,可以按照工具的使用方法随意支配。
用户文件又分为临时文件和库文文件,临时文件又细分为具有可执行权限的[g]文件,以及没有执行权限的[sad]文件。库文件[cpfb]对工具来说是完全等价的,但在使用习惯上用户可以自己安排。
文件系统---工具文件---库文件------------[z] -- 工具管理员管理使用
|
|--用户文件---库文件-------[c/p/f/b] -- 用户自己管理使用
| |
| |--临时文件----[s/a/d] -- 用户具有增删改查全部权限
| |--[g] -- 用户临时可执行文件
|
|--用户镜像文件[.[s/a/d/g/c/p/f/b]] --隐藏文件,所有用户不可用
|
|--工具镜像文件[.z] -- 隐藏文件,所有用户不可用
2.3 AE文件命名规则
刚接触工具的人都会对工具的命名规则感到惊奇,工具本身用[ae]两个字母表示,工具使用到的所有文件都用单字母表示。工具采用这种简洁命名法则,目的是降低用户的输入负担,提高命令使用效率。
简洁是工具的基本特性,简洁思想贯穿在整套工具的开发设计当中。
用户接触到的文件总体上分为临时文件和库文件。
临时文件可以随便创建,删除,修改,查询而不会影响系统稳定性。临时文件中的[s]文件可以以标签为单位跟任意库文件传递文本信息。
库文件是以标签为单位保存信息,信息可以是普通的文本也可以是脚本的文本。库文件必须借助[s]文件以标签为单位对存储信息进行管理。可以通过指令[ae help label]了解标签的使用规则
下表展示了用户所有文件命名规则及文件类型分类信息:
文件名 英文名 文件类型 命名说明
s source 临时文件 源文件,所有库文件标签文本的来源
a assist 临时文件 辅助文件,辅助生成目标数据的数据,一般存放中间数据
d dest 临时文件 目标文件,最终想要的结果数据
g game 临时文件 临时脚本文件,最初是为了写游戏算法而创建
c command 库文件 指令用法文件
p private 库文件 私人文件
f file 库文件 基础项目资料文件
b base 库文件 基础脚本库文件
z zero 库文件 工具基础文件,从z文件开始搭建整个应用环境平台
2.4 AE用户文件展示示例
ae
|-- autoeasy.sh -- 工具源码 -- 系统级别功能支持
|-- autoeasy.txt -- z文件 -- [ae z] -- 工具库文件:所有用户公共信息和公共应用
|-- .autoeasy.txt -- z镜像文件 -- 工具镜像库文件:存放用户上传文件等信息
|
autoeasy1:用户1工作目录 -- 用户自己设定
|-- s198030001051.txt -- s文件 -- [ae s] -- 临时文件:一般存放数据源
|-- a198030001051.txt -- a文件 -- [ae a] -- 临时文件:一般存放辅助数据
|-- d198030001051.txt -- d文件 -- [ae d] -- 临时文件:一般存放目标数据
|-- g198030001051.sh -- g文件 -- [ae g] -- 临时文件:具有可执行权限的脚本文件
|-- c198030001051.txt -- c文件 -- [ae c] -- 库文件 :语言级库文件,跟具体项目或公无
|-- p198030001051.txt -- p文件 -- [ae p] -- 库文件 :私人库文件
|-- f198030001051.txt -- f文件 -- [ae f] -- 库文件 :公司和项目级别的文本文件信息
|-- b198030001051.txt -- b文件 -- [ae b] -- 库文件 :公司和项目级别的脚本文件
|-- toolbak
|-- .s198030001051.txt -- s镜像文件 -- 系统文件
|-- .a198030001051.txt -- a镜像文件 -- 系统文件
|-- .d198030001051.txt -- d镜像文件 -- 系统文件
|-- .g198030001051.sh -- g镜像文件 -- 系统文件
|-- .c198030001051.txt -- c镜像文件 -- 系统文件
|-- .p198030001051.txt -- p镜像文件 -- 系统文件
|-- .f198030001051.txt -- f镜像文件 -- 系统文件
|-- .b198030001051.txt -- b镜像文件 -- 系统文件
|
autoeasy2:用户2工作目录 -- 用户自己设定
|
autoeasy3:用户3工作目录 -- 用户自己设定
|
…
第3章 用户文件基本用法
3.1 查看全路径文件名
1.使用说明
工具的库文件存放在工具安装目录,用户的所有文件存放在用户工作目录,这些文件从工具的角度来看,都具备全局属性,即可以在系统的任何位置查看到这些文件。
2.全路径文件名
文件的全路径文件名=“工作目录”+“单字符文件名”+“ip生成的id字符串”+“文件后缀名”。例如[s]文件名[/lidp/priv/zsp/autoeasy/s198030001051.txt],其中[/lidp/priv/zsp/autoeasy]为用户工作目>录,[s]为单字符文件名[198030001051]为用户IP生成的id字符串,[.txt]为文件的后缀名。
工作目录是用户在注册的时候指定的,一般为个人私人目录下的autoeasy目录。
id字符串由ip字符串按段格式化为3位数字组成,例如ip[198.30.1.51]生成的id为[198030001051]。id字符串只是为了区分不同的用户,我们都是通过单字符调用文件,实际操作中不会让用户输入id字段
。
文件后缀名除了[g]文件为[.sh],其他文件的后缀名都是[.txt]。
3.语法规则
[ae SF],SF表示单字符文件名,后面用法相同。
4.常用指令
命令 命令说明 示例展示
ae s 查看临时文件s的全路径文件名 /lidp/priv/zsp/autoeasy/s198030001051.txt
ae a 查看临时文件a的全路径文件名 /lidp/priv/zsp/autoeasy/a198030001051.txt
ae d 查看临时文件d的全路径文件名 /lidp/priv/zsp/autoeasy/d198030001051.txt
ae g 查看临时文件g的全路径文件名 /lidp/priv/zsp/autoeasy/g198030001051.sh
ae c 查看库文件c的全路径文件名 /lidp/priv/zsp/autoeasy/c198030001051.txt
ae p 查看库文件p的全路径文件名 /lidp/priv/zsp/autoeasy/p198030001051.txt
ae b 查看库文件b的全路径文件名 /lidp/priv/zsp/autoeasy/b198030001051.txt
ae f 查看库文件f的全路径文件名 /lidp/priv/zsp/autoeasy/f198030001051.txt
ae z 查看工具库文件z的全路径文件名 /lidp/priv/zsp/autoeasy/z198030001051.txt
3.2 type查看文件类型
1.使用说明
工具对每个文件都指定了文件类型,目的是方便用户对文件分类使用。文件类型都用数字表示。文件类型:1-临时文件txt,2-临时文件sh,3-库文件,4-系统库文件,0-非工具文件。一般通过这个命令>在脚本中判断用户输入的是不是工具的文件名,以及输入的文件名类型。
另外工具对镜像文件也规定了文件类型,文件类型是其非镜像文件的负数,例如[.s]文件的文件类型是[-1]。由于镜像文件只被工具本身使用,所以就没必要介绍其详细用法了。
2.语法规则
[ae type SF]
3.常用指令
命令 命令说明 输出类型值
ae type s 查看临时文件s的文件类型 1
ae type a 查看临时文件a的文件类型 1
ae type d 查看临时文件d的文件类型 1
ae type g 查看临时文件g的文件类型 2
ae type c 查看库文件c的文件类型 3
ae type p 查看库文件p的文件类型 3
ae type b 查看库文件b的文件类型 3
ae type f 查看库文件f的文件类型 3
ae type z 查看工具库文件z的文件类型 4
ae type o 查看不存在的工具文件类型 0
3.3 cat打印文件内容
1. 使用说明
通过cat命令将文件内容打印在屏幕,如果是临时文件则查看全部文本内容,如果是库文件则查看全部标签。
2. 语法规则
[ae SF cat]
3. 常用指令
命令 命令说明 等价说明
ae s cat 查看s文件内容,等价于 cat $(ae s)
ae d cat 查看d文件内容,等价于 cat $(ae d)
ae a cat 查看a文件内容,等价于 cat $(ae a)
ae g cat 查看g文件内容,等价于 cat $(ae g)
ae c cat 查看c文件的全部标签,等价于 grep "^#:" $(ae c)
ae p cat 查看p文件的全部标签,等价于 grep "^#:" $(ae p)
ae b cat 查看b文件的全部标签,等价于 grep "^#:" $(ae b)
ae f cat 查看f文件的全部标签,等价于 grep "^#:" $(ae f)
ae z cat 查看z文件的全部标签,等价于 grep "^#:" $(ae z)
ae c cat str 查看c文件标签行中含有字符串str的标签,等价于 grep "^#:" $(ae c)|grep str
ae p cat str 查看p文件标签行中含有字符串str的标签,等价于 grep "^#:" $(ae p)|grep str
ae b cat str 查看b文件标签行中含有字符串str的标签,等价于 grep "^#:" $(ae b)|grep str
ae f cat str 查看f文件标签行中含有字符串str的标签,等价于 grep "^#:" $(ae f)|grep str
ae z cat str 查看z文件标签行中含有字符串str的标签,等价于 grep "^#:" $(ae z)|grep str
3.4 vi/view打开编辑文件内容
1.使用说明
用vi编辑器打开指定文件,该指令只能作用于用户临时文件。用view编辑器打开指定文件,该指令既可以打开临时文件也可以打开库文件。打开库文件的时候不建议对文件进行强制编辑保存,库文件有自
己的一套修改方法,后面会做具体介绍。
2.语法规则
[ae SF vi]:编辑打开文件
[ae SF view]:查看打开文件
3.常用指令
命令 命令说明 等价说明
ae s vi 用vi打开s文件 vi $(ae s)
ae d vi 用vi打开d文件 vi $(ae d)
ae a vi 用vi打开a文件 vi $(ae a)
ae g vi 用vi打开g文件 vi $(ae g)
ae s view 用view打开s文件 view $(ae s)
ae d view 用view打开d文件 view $(ae d)
ae a view 用view打开a文件 view $(ae a)
ae g view 用view打开g文件 view $(ae g)
ae c view 用view打开c文件 view $(ae c)
ae p view 用view打开p文件 view $(ae p)
ae b view 用view打开b文件 view $(ae b)
ae f view 用view打开f文件 view $(ae f)
ae z view 用view打开z文件 view $(ae z)
3.5 trun清空临时文件
1.使用说明
清空临时文件。
2.语法规则
[ae SF trun]
3.常用指令
命令 命令说明 等价说明
ae s trun 清空s文件 >$(ae s)
ae d trun 清空d文件 >$(ae d)
ae a trun 清空a文件 >$(ae a)
ae g trun 清空g文件 >$(ae g)
3.6 bak库文件备份
1.使用说明
个人库文件存放信息量较大,为了确保文件信息安全,需要经常对库文件进行备份。备份文件存放在源文件所在目录下的toolbak目录,备份文件名为当前文件名加上时间戳。如果想将备份文件保存在其他>系统,那么需要用户自己写sh脚本,通过库文件脚本命令将文件上传到其他服务器。
2.语法规则
[ae bak]:
[ae toolbak]:
3.常用指令
命令 命令说明
ae bak 备份个人库文件到工作目录下的toolbak目录.
ae toolbak 备份工具库文件autoeasy.txt和工具本身autoeasy.sh到工具部署目录下的toolbak目录
4. 用法展示
下图展示了备份文件的基本操作过程:
PL3:/lidp>cd $(ae home)
PL3:/lidp/priv/zsp/autoeasy>ls -lrt
-rw-r--r-- 1 lidp oinstall 422973 May 31 08:32 c198030001051.txt
-rw-r--r-- 1 lidp oinstall 273 May 31 08:37 a198030001051.txt
-rw-r--r-- 1 lidp oinstall 0 May 31 10:52 d198030001051.txt
-rw-r--r-- 1 lidp oinstall 372656 May 31 11:06 b198030001051.txt
-rwxr--r-- 1 lidp oinstall 245 May 31 16:10 g198030001051.sh
-rw-r--r-- 1 lidp oinstall 3542653 Jun 1 08:53 f198030001051.txt
-rw-r--r-- 1 lidp oinstall 6525 Jun 1 08:53 s198030001051.txt
PL3:/lidp/priv/zsp/autoeasy>ae toolbak
bak success!
PL3:/lidp/priv/zsp/autoeasy>ls -lrt toolbak
-rw-r--r-- 1 lidp oinstall 186357 Jun 1 11:19 p198030001051.txt.20180601111908
-rw-r--r-- 1 lidp oinstall 3542653 Jun 1 11:19 f198030001051.txt.20180601111908
-rw-r--r-- 1 lidp oinstall 422973 Jun 1 11:19 c198030001051.txt.20180601111908
-rw-r--r-- 1 lidp oinstall 372656 Jun 1 11:19 b198030001051.txt.20180601111908
PL3:/lidp/priv/zsp/autoeasy>cd $(ae toolhome)
PL3:/lidp/priv/zsp/shbin>ls -lrt
-rw-r--r-- 1 lidp oinstall 40813 May 31 09:16 autoeasy.txt
-rwxr--r-- 1 lidp oinstall 46104 Jun 1 09:26 autoeasy.sh
PL3:/lidp/priv/zsp/shbin>ae toolbak
toolbak success!
PL3:/lidp/priv/zsp/shbin>ls -lrt toolbak
-rw-r--r-- 1 lidp oinstall 40813 Jun 1 11:20 autoeasy.txt.20180601112010
-rwxr--r-- 1 lidp oinstall 46104 Jun 1 11:20 autoeasy.sh.20180601112010
3.7 cp拷贝文件
1.使用说明
将指定文件拷贝到临时文件,其中cp指令是隐含调用的。该功能实现将右文件拷贝到左文件,如果右文件是库文件则将该库文件的所有标签拷贝到左文件,否则将右文件的全部文本内容拷贝到左文件。
左文件必须是用户临时文件[asdg],该功能只能把其他文件拷贝到临时文件,而不能把临时文件拷贝到其他文件。右文件如果用户临时文件,则直接用单字符文件名表示[asdg]。如果是普通文本文件,则
直接输入该文件名。右文件如果是库文件,则直接输入库文件的单字符文件名,工具会自动把右文件的所有标签拷贝到临时文件。
2.语法规则
[ae 左文件 右文件]
[ae SF SF]
左文件必须是[asdg],右文件可以是[asdgcpbf],也可以是普通文本文件。
3.常用指令
命令 命令说明 等价说明
ae s d 将d临时文件的内容拷贝到s临时文件 cp $(ae s) $(ae d)
ae s a 将a临时文件的内容拷贝到s临时文件 cp $(ae s) $(ae a)
ae s g 将g临时文件的内容拷贝到s临时文件 cp $(ae s) $(ae g)
ae a s 将s临时文件的内容拷贝到a临时文件 cp $(ae a) $(ae s)
ae d s 将s临时文件的内容拷贝到d临时文件 cp $(ae d) $(ae s)
ae g s 将s临时文件的内容拷贝到g临时文件 cp $(ae g) $(ae s)
ae s test.c 将文件test.c的全部文本内容拷贝到s临时文件 cp test.c $(ae s)
ae a test.c 将文件test.c的全部文本内容拷贝到a临时文件 cp test.c $(ae a)
ae d test.c 将文件test.c的全部文本内容拷贝到d临时文件 cp test.c $(ae d)
ae g test.c 将文件test.c的全部文本内容拷贝到g临时文件 cp test.c $(ae g)
ae s c 将c库文件的全部标签拷贝到s临时文件 ae c cat >$(ae s)
ae a p 将p库文件的全部标签拷贝到a临时文件 ae p cat >$(ae a)
ae d b 将b库文件的全部标签拷贝到a临时文件 ae b cat >$(ae d)
ae g f 将f库文件的全部标签拷贝到a临时文件 ae f cat >$(ae g)
标签级别拷贝: (具体用法参考1.4库文件信息管理)
ae c s 将s临时文件的标签内容保存或替换c用户库文件对应标签的内容
ae p s 将s临时文件的标签内容保存或替换p用户库文件对应标签的内容
ae b s 将s临时文件的标签内容保存或替换b用户库文件对应标签的内容
ae f s 将s临时文件的标签内容保存或替换f用户库文件对应标签的内容
ae z s 将s临时文件的标签内容保存或替换z系统库文件对应标签的内容,只有工具管理员才有此权限,普通用户没有权限进行该操作.
ae c tagname 查看c库文件tagname标签的内容,将标签内容打印在屏幕同时拷贝在s临时文件,标签只能拷贝到s临时文件不能拷贝到其他临时文件
ae p tagname 查看p库文件tagname标签的内容,并将标签内容拷贝到s文件
ae b tagname 查看b库文件tagname标签的内容,并将标签内容拷贝到s文件
ae f tagname 查看f库文件tagname标签的内容,并将标签内容拷贝到s文件
ae z tagname 查看z库文件tagname标签的内容,并将标签内容拷贝到s文件
3.8 diff比较临时文件差异
1.使用说明
比较临时文件差异。
2.语法规则
[ae SF SF diff]
3.常用指令
命令 命令说明 等价说明
ae s d diff 比较s文件和d文件的异同 diff $(ae s) $(ae d)
ae s a diff 比较s文件和a文件的异同 diff $(ae s) $(ae a)
ae d s diff 比较d文件和s文件的异同 diff $(ae d) $(ae s)
ae d a diff 比较d文件和a文件的异同 diff $(ae d) $(ae a)
ae a s diff 比较a文件和s文件的异同 diff $(ae a) $(ae s)
ae a d diff 比较a文件和d文件的异同 diff $(ae a) $(ae d)
第4章 库文件信息管理
4.1 AE标签介绍
AE库文件以标签为单位进行信息管理,一个完整的标签由"标签名",“标签类型”,“标签描述”,"标签文本"四部分组成。其中除标签名以外,其他几个部分都是非必须项,但一个完整的结构有利于后续查
询和维护。
1.标签名
标签名必须是由英文字母、数字和下划线(_)组成的字符串,标签名是对整个文本内容起的名字,一般用有意义的英文或者数字表示。
2.标签类型
标签类型是对标签种类的划分,除系统定义的标签类型之外,用户也可以自己定义标签类型。目前系统只设定了两种内部标签类型[sh]和[const]。[const]类型标识的脚本,不可以通过标签的[del]命令>删除。[sh]标识的脚本表示该标签内容是脚本程序,可以通过工具的[sh]命令执行该脚本。
3.标签描述
标签描述是整个标签文本的概要描述,清晰的标签描述方便以后查询和使用。另外标签描述还有利于标签的检索,能够方便快速查找到一些记忆模糊的标签名。
4.标签文本
标签文本就是标签的全部内容,也是整个标签的主体。我们工作中接触到的所有文本信息,都可以作为标签文本。包括项目需求文档,详细设计文档,数据库表结构信息,上线信息,客户联系方式等等。
5.标签使用示例
下面展示了一个表结构的标签信息:
#:t_zero_sys_inf:table:地方授权支付-主控档参数表 表维护:0504
fina_code CHAR 4 财政代码
fina_name VARCHAR2 48 财政名称
coun_code VARCHAR2 20 国库代码
buss_switch CHAR 1 业务开关 不可空,0-关;1-开
buss_type CHAR 4 业务流程方式([0]0-手工导盘,1-电子直联)
clr_flag CHAR 1 清算标志 不可空,0-未清算;1-已清算
4.2 AE标签命令汇总
下表展示了标签的常用命令,不同命令都有具体的使用场景。
命令 命令说明 使用场景
ae c s 将s临时文件的标签内容保存或替换c用户库文件的内容 标签新增/修改
ae p s 将s临时文件的标签内容保存或替换p用户库文件的内容 标签新增/修改
ae b s 将s临时文件的标签内容保存或替换b用户库文件的内容 标签新增/修改
ae f s 将s临时文件的标签内容保存或替换f用户库文件的内容 标签新增/修改
ae z s 将s临时文件的标签内容保存或替换z系统库文件的内容 标签新增/修改
ae c tag 查看c库文件tagname标签的内容 标签查询
ae p tag 查看p库文件tagname标签的内容 标签查询
ae b tag 查看b库文件tagname标签的内容 标签查询
ae f tag 查看f库文件tagname标签的内容 标签查询
ae z tag 查看z库文件tagname标签的内容 标签查询
ae c tag del 删除c文件的tag内容 标签删除
ae p tag del 删除p文件的tag内容 标签删除
ae b tag del 删除b文件的tag内容 标签删除
ae f tag del 删除f文件的tag内容 标签删除
ae z tag del 删除z文件的tag内容 标签删除
ae c tag del 0 以安静模式删除c文件的tag标签 标签删除
ae p tag del 0 以安静模式删除p文件的tag标签 标签删除
ae b tag del 0 以安静模式删除b文件的tag标签 标签删除
ae f tag del 0 以安静模式删除f文件的tag标签 标签删除
ae z tag del 0 以安静模式删除z文件的tag标签 标签删除
4.3 AE标签新增
标签新增即标签的创建和保存,是库文件文本内容的唯一来源。库文件只与[s]临时文件进行信息交互,通过命令[ae s vi]在s文件中创建标签,然后通过[ae f s]命令将标签保存到指定的库文件。
如果想把一个文本文件保存到库文件中,只需要通过[ae s filename]将文件拷贝到s临时文件,然后通过[ae s vi]给临时文件加上标签,最后通过[ae f s]指令将标签保存到指定库文件。
新增标签工具不给出是否新增的提示,直接将标签保存到库文件。如果库文件中已经存在同名标签则会给出是否覆盖的提示。如果两个标签文本没有对应关系,则必须修改标签名之后再保存。
4.4 AE标签删除
标签删除即删除库文件中的标签文本,目的是清除库文件中的无用信息。标签删除需要先查询到标签名[tagname],然后通过指令[ae f tagname del]将其删除。为了防止误删,AE会提醒用户是否真的打>算删除该标签,只有在用户输入[y]同意删除之后,AE才会执行删除动作。删除标签是不可逆的,标签一旦删除就无法恢复,所以必须慎重使用删除命令。另外平时也要养成备份库文件的习惯,一旦误删>还可以从备份文件中将标签手动还原。
另外AE还支持安静模式删除,即不想收到提示信息,直接删除指定标签。这种情况只需要在上述指令后面加一个[0]参数,即使用指令[ae f tagname del 0]即可直接将标签文本删除。安静模式删除风险>更高,使用的时候必须慎重。
4.5 AE标签查询
标签查询即查看库文件标签文本内容,这个是最常用的标签操作。如果知道标签保存在哪个库文件并且知道标签名,则可以直接通过指令[ae f tagname]将标签内容打印在屏幕。这个命令同时会将标签内
容保存在[s]临时文件,如果需要多次查看只需要输入命令[ae s cat]即可。
如果只知道标签的大概描述信息,则可以先通过模糊查找确定标签名,然后再按照上述方法查看标签内容。模糊查找即通过指令[ae f cat|grep info]查看含有指定信息的所有标签信息,然后根据描述筛
选出自己想要查看的标签名。
如果没有设置标签描述或者标签描述信息很少,那就只能通过[ae f view]指令打开整个库文件,然后全局搜索自己想要的文本内容。如果找到就往后翻页查找文本的标签名,最后退出就可以通过标签名>查看标签文本了。这种查找方法比较麻烦,为了以后查找方便,在新增标签的时候一定要养成设置标签描述的习惯。
4.6 AE标签修改
标签修改即修改库文件标签内容,修改标签可以通过以下几个步骤来完成。首先通过指令[ae f tagname]把标签文本取出放到[s]临时文件,然后通过[ae s vi]修改标签文本,最后通过[ae f s]将修改后
的标签保存到库文件。
保存标签的时候AE会提示是否覆盖现有标签文本,并给出两个文本的差异信息。如果确定覆盖则输入[y],如果不想覆盖输入[n]。对于不想覆盖的情况,如果还想保存[s]文件中的标签,只需要给标签改>一个名字,然后就可以通过[ae f s]保存标签了。这种情况相当于新增了一个标签,这个新增标签相当于原标签的升级版。
另外AE不支持安静模式修改,即不收到提示信息,直接修改标签文本内容。如果用户确实不想收到提示信息,则可以先通过指令 [ae f tagname del 0]将原标签文本安静删除,然后通过[ae f s]将修改>后的标签保存在库文件。
4.7 AE子标签
1.子标签作用
如果一个标签文本比较大,直接通过标签查看文本会比较困难,这个时候可以考虑给该文本设置子标签,然后通过子标签来查看对应的文本信息。通过设置子标签可以让标签的文本内容结构更加清晰,子
标签相当于文档结构图,使用起来非常方便。
2.子标签格式
子标签的格式跟主标签基本相同。也是有标签名,标签类型和标签描述,标签文本四个部分组成。但子标签跟主标签又有一定的差异,主要体现下如下几个方面。
3.子标签跟主标签的差异
3.1标签头的标识不同。
主标签用[#:]作为一个标签开始的标志,子标签用[–:]作为标签开始的标志。
3.2标签名的命名规范程度不同。
主标签的标签名命名非常严格,子标签的标签名命名比较随意。子标签的标签名可以使任意字符,中文,特殊字符等。主标签的标签名在同一个库文件中不可以重名,子标签的标签名在同一个文件甚至同
一个主标签中都可以重名,对子标签的命名几乎没有任何限制。
3.3标签个数不同。
一个标签文本只能命名一个主标签,但一个标签文本可以命名多个子标签。子标签不能独立存在,必须依附于主标签而存在。子标签的个数并不是越多越好,如果标签文本内容不是很多,也可以不设置子
标签。
3.4. 显示方式不同。
主标签查看标签文本,文本信息会自动保存在[s]临时文件。通过子标签查看标签文本信息,文本信息只会打印在屏幕,而不会保存在[s]临时文件。子标签设置的目的主要是用来查看信息的,而不是管理
信息,所以没有必要存放在临时文件。
4.8 AE子标签分层
AE子标签类似word文档的文档结构图,通过命名子标签可以让整个标签文本更有层次感。子标签分层的多少,以获得最佳月度体验为宜。我们设置word文档结构图的经验,完全可以照搬过来用于设置子标
签。
1.一级子标签。
一级子标签用[–:]开头,可以通过[ae f tag pg]命令查看一个主标签的所有一级子标签信息,然后通过[ae f tag pg child]查看某个具体的一级子标签的文本信息。一级子标签的文本包括该子标签下>的所有文本,如果有命名其他等级的子标签,也会一并显示出来。
2.二级子标签。
二级子标签用[—:]开头,可以通过命令[ae f tag pg child pg]命令查看一个一级子标签的所有二级子标签信息,然后通过[ae f tag pg child pg child]命令查看一个二级子标签的文本信息。二级子
标签的文本信息,同样包括其下命名的其他登记的子标签。
3.三级子标签。
三级子标签用[----:]开头,可以通过命令[ae f tag pg child pg child pg]命令查看一个二级子标签的所有三级子标签信息,然后通过[ae f tag pg child pg child pg child]命令查看一个三级子标>签的标签文本。
4. n级子标签。
子标签每增加一级就在标签标识前面增加一个[-]符号,一般情况下超过三级的子标签基本不会用到。子标签并不是设置的越多越好,一般设置到两三个屏幕能够显示完一个子标签的内容为最佳。太多的>子标签只会让查询的指令非常长,操作起来非常的不方便。
5. 子标签结构图示例
下面展示一个子标签的基本简图:
#:tagname:doc:主标签描述信息
---------------------------------------------------------------------------------
--:1:第1个一级子标签
---------------------------------------------------------------------------------
content1
---:1.1:第1个二级子标签
content1.1
----:1.1.1:第1个三级子标签
content1.1
----:1.1.2:第2个三级子标签
content1.1
content1.1
---:1.2:第2个二级子标签
content1
-----------------------------------------------------------------------------------
--:2:第2个一级子标签
---------------------------------------------------------------------------------
content2
---:2.1:二级子标签
content2
---:2.2:二级子标签
content2
---------------------------------------------------------------------------------
--:3:第3个一级子标签
---------------------------------------------------------------------------------
content3
content3
content3
4.9 AE子标签新增修改及删除
AE子标签必须依附主标签而存在,AE没有设置单独的指令来修改子标签。如果要修改子标签的内容,必须先通过指令[ae f tag]将整个标签拿到[s]临时文件,然后通过[ae s vi]编辑标签内容。可以通过
子标签名搜索子标签的位置,然后修改子标签。修改完保存退出之后,通过[ae f s]命令将整个标签文本保存到库文件。修改子标签即修改对应的主标签,具体操作可参照文档主标签的相应模块。
子标签的新增和删除也相当于修改主标签,新增的时候只需要按照子标签的配置规则配置子标签即可,删除的时候也只需要删除该子标签的标识。
4.10 AE子标签常用命令
命令 命令说明 备注
ae f tag pg 查看f库文件tag标签的所有一级子标签
ae b tag pg 查看b库文件tag标签的所有一级子标签
ae c tag pg 查看c库文件tag标签的所有一级子标签
ae p tag pg 查看p库文件tag标签的所有一级子标签
ae z tag pg 查看z库文件tag标签的所有一级子标签
ae f tag pg c1 查看f库文件tag标签的c1一级子标签文本
ae b tag pg c1 查看b库文件tag标签的c1一级子标签文本
ae c tag pg c1 查看c库文件tag标签的c1一级子标签文本
ae p tag pg c1 查看p库文件tag标签的c1一级子标签文本
ae z tag pg c1 查看z库文件tag标签的c1一级子标签文本
ae f tag pg c1 pg 查看f库文件tag标签的c1一级子标签的所有二级子标签
ae f tag pg c1 pg c1.1 查看f库文件tag标签的c1一级子标签的c1.1二级子标签的文本信息
ae f tag pg c1 pg c1.1 pg 查看f库文件tag标签的c1一级子标签的c1.1二级子标签的所有三级子标签 很少用
ae f tag pg c1 pg c1.1 pg c1.1.1 查看f库文件tag标签的c1一级子标签的c1.1二级子标签的c1.1.1三级子标签的文本内容 很少用
ae f tag pg c1 pg c1.1 pg c1.1.1…… 多级子标签查询 很少用
4.11 AE子标签应用示例
AE子标签的一个典型应用场景,就是维护需求开发计划文档。如果收到一份小的开发需求,可以直接给这个需求定义一个标签,然后把自己的开发测试过程,源码清单,需求文档,接口文档等信息,都通过子标签记录下来。通过需求标签,我们就可以随时随地查看需求内容及开发进度。通过标签和子标签的相互配合,整个需求开发过程就一目了然。以后任何时候想查看这个需求的开发信息,都只需要一条指令就可以跟踪整个需求开发过程了。
下图展示了一份普通的需求开发标签文本信息:
#:0072_5:requre:G:\2018req\20180151-黄埔区授权支付项目需求(2018年3月2日)
--------------------------------------------------------------------------------
--:1:源码清单
--------------------------------------------------------------------------------
1.前端
......
2.后台
......
3.参数配置
......
--------------------------------------------------------------------------------
--:2:开发测试
--------------------------------------------------------------------------------
1.代扣费
......
2.定期借记及集中代付
......
3.0510
......
<此处省略100行>
......
--------------------------------------------------------------------------------
--:3:<<需求信息--黄埔区授权支付项目需求(2018年3月2日)>>
--------------------------------------------------------------------------------
需求详细信息
......
<此处省略50行>
......
--------------------------------------------------------------------------------
--:4:需求42/<<附件:黄埔支行授权支付项目需求>>
--------------------------------------------------------------------------------
需求详情:
......
<此处省略400行>
......
--------------------------------------------------------------------------------
第5章 库文件脚本管理
5.1 AE脚本标签介绍
标签文本类型如果设置为[sh]类型,则表示该标签文本为脚本程序,我们把这样的标签称为脚本标签。脚本标签从文本的角度来看,跟普通标签没有任何区别,支持文本标签的全部操作指令。脚本标签在普通标签的基础上增加了可执行权限,可以实现普通sh脚本的所有功能。通过工具对脚本标签的统一管理,能够让sh脚本实现各种强大的功能,最终能让我们的工作实现自动化。
5.2 AE临时文件脚本执行
AE临时文件内容,如果是脚本指令,是可以通过AE直接执行的。临时文件执行的语法规则统一为[ae SF sh],但对不同类型的临时文件,执行过程有一些差异。
1.[asd]临时文件脚本执行
对于[asd]临时文件,工具首先把临时文件内容拷贝到系统的[s]镜像文件,然后检索[s]镜像文件有没有AE的特殊语法变量,如果有就先执行AE的特殊语法。最后将[s]镜像文件内容拷贝到[g]镜像文件并>执行该镜像文件。
2.[g]临时文件脚本执行
用户[g]文件是可执行临时文件,工具会直接运行[g]文件来执行里面的脚本命令。可以把[g]文件理解为普通的sh脚本文件,AE不对该文件提供任何特殊语法支持。
3.临时文件脚本跟标签脚本差异
由于临时文件内容经常被覆盖或删除,如果想作为常用的工具脚本就必须保存在库文件中。库文件的标签脚本是比较稳定的,如果用户不强制删除,就会一直存在。
4.临时文件执行命令汇总
命令 命令说明 是否提供特殊语法支持
ae s sh 执行s临时文件中的文本脚本 是
ae a sh 执行a临时文件中的文本脚本 是
ae d sh 执行d临时文件中的文本脚本 是
ae g sh 执行g临时文件中的文本脚本 否
5.3 AE标签脚本的执行过程
AE标签脚本的执行过程跟临时文件脚本的执行过程基本相同,只是脚本指令的来源存在差异。临时文件脚本指令来源于临时文件文本,脚本标签的指令来源于标签本身。
当执行标签脚本的时候,工具会首先将标签脚本的文本内容拷贝到[s]镜像文件,然后从[s]镜像文件拷贝到[g]镜像文件,最后执行[g]镜像文件。
如果执行指令带上了参数则工具会使用用户输入参数,如果没有带任何参数,则工具会自动检测脚本文本的"动态参数提醒"字符串,按照提示动态获取参数。
在脚本标签内容从[s]镜像文件拷贝到[g]镜像文件之前,工具会自动检测脚本文本中的"导入库函数指令",将相应函数提取到[g]镜像文件,然后再将[s]镜像文件的文本内容追加到[g]镜像文件。
脚本标签执行命令汇总:
命令 命令说明 库函数导入 动态参数
ae b hello sh 执行b库文件的hello标签脚本 支持 支持
ae b hello sh para 执行b库文件的hello标签脚本 支持 不支持
ae f hello sh 执行f库文件的hello标签脚本 支持 支持
ae f hello sh para 执行f库文件的hello标签脚本 支持 不支持
ae c hello sh 执行c库文件的hello标签脚本 支持 支持
ae c hello sh para 执行c库文件的hello标签脚本 支持 不支持
ae p hello sh 执行p库文件的hello标签脚本 支持 支持
ae p hello sh para 执行p库文件的hello标签脚本 支持 不支持
ae z hello sh 执行z库文件的hello标签脚本 支持 支持
ae z hello sh para 执行z库文件的hello标签脚本 支持 不支持
5.4 AE脚本标签tippara动态参数及para参数获取
1. 语法说明
脚本中可以通过定义tippara变量,然后通过para指令动态获取脚本的执行参数。tippara变量是按照逗号分隔的普通字符串,每段表示一个提示信息。tippara变量的基本格式为"提示信息1,提示信息2,提示信息3…"。一个标签脚本可以定义多个tippara变量,tippara变量的顺序对应[para]指令的第一个参数,上面提示信息的位置对应[para]指定的第二个参数。
[para]指令的基本语法是[ae para n m],n和m均为数字,n表示脚本文件中tippara出现的顺序,m表示一个tippara变量的提示信息的位置。如果指定的tippara变量不存在或者指定位置的提示信息不存在
则该指令返回空值。
2.获取参数命令汇总:
命令 命令说明
ae para 1 1 获取用户第1个tippara变量的第1个提示信息参数
ae para 1 2 获取用户第1个tippara变量的第2个提示信息参数
ae para 1 3 获取用户第1个tippara变量的第3个提示信息参数
ae para 2 1 获取用户第2个tippara变量的第1个提示信息参数
ae para 2 2 获取用户第2个tippara变量的第2个提示信息参数
ae para 2 3 获取用户第2个tippara变量的第3个提示信息参数
ae para 3 1 获取用户第3个tippara变量的第1个提示信息参数
ae para 3 2 获取用户第3个tippara变量的第2个提示信息参数
ae para 3 3 获取用户第3个tippara变量的第3个提示信息参数
ae para 1 1 获取用户第1个tippara变量的第1个提示信息参数
ae para 1 2 获取用户第1个tippara变量的第2个提示信息参数
3.tippara变量定义要求
tippara变量必须作为一行的开头,变量名前面不能出现其他任何字符,变量名必须小写。变量中的不同提示信息之间必须用逗号分隔,同一个提示信息中不能再出现逗号字符,如果出现工具会自动当做>两条提示信息来处理。
4.动态参数用法举例
#:hello:sh:测试脚本
------------------------------------------
tippara="请输入姓名(def:张三),请输入年龄(def:30)"
......
tippara="请输入性别(def:男)"
......
tippara="请输入手机号(def:10086),请输入地址(eg:广州)"
......
p11=$(ae para 1 1) --> 张三
p12=$(ae para 1 2) --> 30
p13=$(ae para 1 3) --> ""
p21=$(ae para 2 1) --> 男
p22=$(ae para 2 2) --> ""
p23=$(ae para 2 3) --> ""
p31=$(ae para 3 1) --> 10086
p32=$(ae para 3 2) --> 广州
p33=$(ae para 3 3) --> ""
5.5 AE脚本标签importinfo库函数导入
1.语法说明
脚本中可以定义[importinfo]变量来导入已经写好的脚本函数或指令,importinfo是一个普通的字符串变量,变量中存储的是AE指令,多个指令之间用逗号分隔。importinfo变量的基本格式为"指令1,指令2,指令3…"。
一个标签脚本可以定义多个importinfo变量,一个importinfo变量又可以定义多条指令,工具在将脚本命令从[s]镜像文件拷贝到[g]镜像文件之前自动运行每条指令,然后将运行结果追加到[g]镜像文件>,最后才将标签脚本内容追加进来。
通过importinfo导入库函数经常会与子标签命令[pg]一起使用,任何文件只要将一个函数定义为子标签就可以通过importinfo变量引入到当前标签脚本中。
3.importinfo变量定义要求
importinfo变量必须作为一行的开头,变量签名前面不能出现其他任何字符,变量名必须小写。变量中的不同指令之间必须用逗号分隔,同一个指令中不能再出现逗号,如果出现工具会自动当做两条指令
来处理。
4.相比较定义多个标签脚本的优势
AE标签脚本运行标签外的脚本有两种方式,一个是将标签外的脚本也命名成标签脚本,然后通过当前标签脚本调用另外一个标签脚本。另外一种方式是将当前标签外的脚本定义成子标签,然后通过importinfo引入到当前脚本程序中。两种方式各有自己的优缺点,通过importinfo引入的方式有如下优点。
首先可以让一个标签脚本的功能更加完善,结构更加清晰,通过一个标签就可以跟踪整个执行过程。
其次运行开销小,通过函数引用最终只会运行一个脚本,最终执行的脚本会保存在[g]镜像文件中,万一报错还可以直接查询原因。如果通过标签脚本的彼此调用来实现,则[g]镜像文件会被后面执行的脚
本覆盖,之前的脚本标签出错原因就没办法跟踪了。
最后是便于升级和维护,如果发现某个函数有缺陷只需要修改这个函数即可,其他引用的地方都可以得到最终升级的函数。
5.用法示例
#:hello:sh:测试脚本
------------------------------------------
importinfo=" ae c shell_fun pg isdigit , ae c shell_fun pg isin"
......
importinfo =" ae c shell_fun pg lower "
......
上面脚本在运行之前工具会自动检测运行importinfo中的指令,然后把运行结果追加到最终的执行脚本中。
5.6 AE标签脚本注释语法
AE标签脚本中可以使用[#]表示注释,这种注释方法跟普通shell脚本的用法完全相同,另外标签脚本还把以[-]开头的行作为注释,标签脚本内容在从[s]镜像文件拷贝到[g]镜像文件之前会自动将以[-]开
头的行替换为以[#]开头。这种特殊设定是为了让标签脚本支持子标签的特殊语法,同时通过[--------]对标签脚本内容分层可以让脚本的结构变得清晰美观。
5.7 echo反向脚本指令生成
[echo]指令可以让临时文件内容转化为可以反向生成自己的脚本指令,通过这个指令可以生成一个复杂脚本的原始框架。在这个框架的基础上,只需要对一些关键细节做些调整就可以生成一个完美的标签
脚本了。
[echo]的基本语法规则为[ae SF echo],SF只包括临时文件,具体指令如下。
命令 命令说明
ae s echo 输出s文件的反向生成自己的脚本命令
ae d echo 输出d文件的反向生成自己的脚本命令
ae a echo 输出a文件的反向生成自己的脚本命令
ae g echo 输出g文件的反向生成自己的脚本命令
5.8 AE子标签脚本
AE子标签脚本的运行过程跟普通标签脚本的运行过程基本相同,都是先找到对应的标签文本,将其拷贝到[s]镜像文件,然后将其拷贝到[g]镜像文件,并在拷贝之前提供一些特殊语法支持,最后运行[g]>可执行程序。但由于子标签只是整个主标签的一部分,子标签完全独立于其他文本内容独立运行,所以子标签脚本有自己的特性。
5.9 AE子标签特性
1.灵活性
子标签可以寄生在任意类型的主标签中,并不要求主标签必须是[sh]类型。只要子标签的内容是脚本代码,并且有自己的名字,就可以通过指令[ae f tag pg child sh]命令执行该子标签。
2. 局部代码测试
对于一个比较大的脚本,如果只想测试其中某一段代码,那么可以通过给这段代码打上子标签,然后通过子标签执行命令运行该段代码。同时配合[tippara]动态参数可以给这段代码输入任何参数,测试>起来非常方便。
3.可复用性
由于子标签具有独立运行特性,如果把一段特殊用途代码编写成脚本函数,然后给该函数设置子标签,最后就可以对这个函数进行单独测试了。如果确定这个函数运行正常,并且适合在多种场合下使用,
那么就可以给这个函数编写一个有意义的子标签名,其他任何地方就可以通过[importinfo]变量引用这个函数,达到子标签复用的效果。
4.可维护性
大多数情况下如果一个主标签中含有子标签脚本,这个主标签基本都是用来保存维护子标签的,可以不作为标签脚本运行,只用来保存标签脚本的库函数。通过一个主标签我们就可以维护大量的
子标签脚本函数,其他主标签脚本可以自由选择从当前主标签脚本库用引用函数。
5.10 AE标签脚本基本用法示例
下图展示了一个通过标签脚本实现的,可以在系统任意位置测试c代码的实现方式。其中[hello1]标签是主函数,[hello1_lib]标签是主函数引用的库函数,[hello2]标签是对主函数的编译过程,[hello]标签调用[hello2]编译标签同时执行最终的可执行程序。
实际应用中,通过[ae c hello1]调出主函数,通过[ae s vi]编写我们需要测试的c代码,然后通过[ae c s]将代码保存在库文件,最后通过[ae c hello sh]运行c代码并查看代码的运行结果。
这只是一个非常简单的使用用标签和标签脚本的示例,后续通过系统提供的基本支持,我们可以很轻松的编写出非常强大的应用来。
#:hello1:c:c程序hello.c源码
#include<stdio.h>
#include<math.h>
#include<string.h>
int
main(int argc,char**argv)
{
char sTemp[1024+1];
char sTemp1[1024+1];
char sTemp2[10240+1];
char sTemp3[1024+1];
/* 个人测试代码 */
printf("hello world!\n");
return 0;
}
#:hello1_lib:lib:库函数
……
#:hello2:sh:编译hello.c生成可执行程序hello
workdir=$(ae home)
cfile=$workdir/hello.c
dfile=$workdir/hello
libfile=$workdir/hello_lib.c
ae c hello1_lib|grep -v "^#:" >$libfile
ae c hello1|grep -v "^#:" >$cfile
echo "cc -o $dfile $cfile"
/usr/bin/rm -f $workdir/*.o $dfile
cc -o $dfile $cfile $libfile
#:hello:sh:编译生成并执行可执行程序 hello
ae c hello2 sh
execfile=$(ae home)/hello
echo $execfile
echo --------------------------------------------------------------------------------
$execfile
第6章 AE用户管理
6.1 AE指令运行三种模式
1. 语法说明
AE系统提供了三种用户指令执行模式,以当前主机IP绑定用户的缺省运行模式,以指定用户运行单条指令模式和以登陆用户运行指令模式。每种运行模式都有自己的优缺点,适合在不同的运行场景中使用。用户通过[ae user]命令可以查看当前系统的所有注册用户,然后根据自己的操作需求选择任意一种运行模式运行指令。
6.2 缺省用户模式
1. 运行模式介绍
新用户通过个人主机注册为AE用户,就可以直接使用AE工具了。此时通过[ae whoami]指令可以查看当前用户,这个用户是AE系统默认的缺省用户,它是跟自己主机的IP绑定的。AE在执行用户输入的指令时会先检测用户主机IP,然后根据IP在[z]文件[aeuserinfo]标签中查询用户注册信息,最后以该用户的身份运行指令。
2. 优缺点
这种方式运行指令最简单,用户操作的都是自己的文件,不用关心对其他用户产生任何影响。
3. 使用场景
这种模式适合在个人主机上的日常办公,也是注册用户的最常用的使用方式。如果想修改个人注册信息,只能在缺省模式下执行。
6.3 指定用户模式
1.运行模式介绍
用户可以通过[ae user name]命令,以AE系统中任意注册用户的身份运行指令。如果不指定用户,系统默认以当前主机的缺省用户运行指令。例如[ae s]命令即查看当前用户的[s]文件的全路径文件名。如果指定用户,系统会先查询[z]文件[aeuserinfo]标签该用户的注册信息,然后以该用户身份运行指令。例如[ae user zhangsuping s]命令即查看[zhangsuping]用户的[s]文件的全路径文件名。
2. 优缺点
这种方式使用起来比较灵活,只要我们知道我们想要的信息在哪个用户那里,就可以直接通过这种模式获取到我们想要的信息。但如果我们通过这种方式运行其他用户写的脚本,如果其他用户的脚本中恰好运行了另外一个AE指令,由于该指令没有指定用户则其执行结果将无法预测。所以这种方式不太适合运行脚本,只适合查询其他用户的标签文本信息。
3. 使用场景
这种方式适合跟其他用户交换信息。
6.4 登陆用户模式
1.运行模式介绍
用户可以通过[ae user login]命令登陆任意已经注册的用户,用户登陆成功系统会在[z]文件的登录标签记录一条登陆信息,这样用户在每次运行指令的时候系统都会先查询登陆信息,如果用户已经登陆就通过[z]文件查询用户的注册信息,最后以登陆用户的注册信息执行该命令。用户一旦登陆成功,则其执行命令的过程和结果跟在自己主机上使用缺省模式的执行结果完全相同。这种方式相当于在他人主机上搭建了一套自己的AE运行环境。
如果用户想切换回主机的缺省用户,则必须先通过[ae user login]命令登出当前登陆用户,然后才能使用缺省用户模式执行指令。
工具对所有登陆信息只默认当天有效,如果系统时间切换到了第二天,则前一天的登录信息会自动失效。这样做的目的是防止用户由于忘记登出,而自己的账号被他人使用。
2.优缺点
如果在自己主机登陆他人账号,频繁切换就会浪费较多时间。另外登陆信息只在当天有效,跨天使用登陆模式就必须重新登陆个人账号。
3.适合场景
这种方式适合在非本人主机登陆本人账户,一般在不方便使用个人主机的场合使用。
6.5 user用户指令汇总
命令 命令说明 备注
查看用户信息:
ae user 查看所有用户注册信息
ae user self 查看当前用户注册信息
ae user zhukebi 查看用户zhukebi的注册信息
缺省用户模式运行指令
ae s 查看当前用户的s文件全路径文件名
ae s cat 查看当前用户s文件内容
ae user modify 用户信息修改
ae b hello sh 运行b库文件的hello脚本
ae user login 选1输入用户名和密码登陆用户,进入用户登陆模式
以指定用户模式运行命令:
ae user self s 查看当前用户的s文件,等价于[ae s]
ae user zhukebi s 查看用户zhukebi的全路径s文件,其他所有文件的查看用法相同.
ae user zhukebi s cat 查看用户zhukebi的s文件内容,其他临时文件内容查看方法相同
ae user zhukebi f cat 查看用户zhukebi的f文件所有标签,其他库文件查看方法相同
ae user zhukebi b hello sh 运行用户zhukebi的b文件的hello标签脚本. 存在风险
登陆用户模式运行指令
ae s 查看当前登陆用户的s文件全路径文件名
ae s cat 查看当前登陆用户s文件内容
ae b hello sh 运行登陆用户b库文件的hello脚本
ae user login 选2输入用户名和密码登出用户,切换回缺省用户模式
第7章 AE格式化文本处理
7.1 文本对齐很重要
如果一段文本是整齐的,那这段文本表达的意思就一目了然。如果一段代码是整齐的,那这段代码实现的功能就非常清晰。文本和代码是否整齐,反映出出一个人的思维是否清晰。只有思维清晰,才能让工作变得轻松愉快。AE对文本对齐提供了大量支持,方便我们存储大量的文本信息。
7.2 ord临时文件文本对齐
通过[ae s ord]命令可以让临时文件文本实现简单的对齐功能,工具检测临时文件文本,将不同文本按照空白字符划分为不同的域,根据每列域的最大长度将文本格式化输出。ord只是简单的封装了awk,但这个功能确是最常用的。下图展示了一个通过ord命令将交易码文本对齐的操作。
[ae s cat]打印的是对齐前的文本内容,[ae s ord]打印的是对齐后的文本内容。对齐前的结构式混乱的,对齐后的结构是清晰的。
PL4:/lidp/log/20180525>ae s cat
序号 报文编号 报文说明 行内系统发送方向 说明
1 CZ203 预算单位授权支付明细清单 双向(财--代) 1
2 CZ213 授权支付汇总额度通知单 双向(财--代) 1
3 CZ214 直接支付额度到账通知单 双向(财--代) 1
4 CZ223 授权支付汇总清算额度通知单 双向(财--人) 1
5 CZ233 直接支付汇总清算额度通知单 双向(财--人) 1
6 CZ213 预算单位授权支付额度到账通知单 双向(财--代) 1
7 CZ303 电子支付指令(直接、授权、拨款) 双向(财--代) 1
8 CZ313 电子支付冲销指令 双向(财--代) 1
9 CZ323 清算支付指令(直接、授权) 代-->财
10 CZ902 对账指令 双向(财--代) 1
PL4:/lidp/log/20180525>ae s ord
序号 报文编号 报文说明 行内系统发送方向 说明
1 CZ203 预算单位授权支付明细清单 双向(财--代) 1
2 CZ213 授权支付汇总额度通知单 双向(财--代) 1
3 CZ214 直接支付额度到账通知单 双向(财--代) 1
4 CZ223 授权支付汇总清算额度通知单 双向(财--人) 1
5 CZ233 直接支付汇总清算额度通知单 双向(财--人) 1
6 CZ213 预算单位授权支付额度到账通知单 双向(财--代) 1
7 CZ303 电子支付指令(直接、授权、拨款) 双向(财--代) 1
8 CZ313 电子支付冲销指令 双向(财--代) 1
9 CZ323 清算支付指令(直接、授权) 代-->财
10 CZ902 对账指令 双向(财--代) 1
7.3 格式化指令基础
系统提供了format格式化字符串功能,format代表格式化字符串,其调用是隐式的。工具会读取[s]临时文件中的域信息,然后通过[format]格式字符串按照指定规则输出。
系统默认,如果[ae n]命令的第一个参数是数字,则表示该条指令执行格式化处理功能。如果第一个参数是[0]则系统默认将格式化字符串中的[%s]按照域的顺序进行对齐替换,如果第一个参数不是[0]则表示将格式化字符串中的所有[%s]都替换为第一个参数指定的域。
格式化字符串中除提供[%s]之外还提供[$n]来替换指定位置上的域,例如[$1]可替换为s文件中的第1域,[$2]可替换s文件中的第2域,依次类推。如果想要替换的域不存在,则该位置会用空字符串填充。
针对英文字符类型的域,工具还提供了[<%s<]或者[<$n<]将该位置的域中的字符转化为小写字符输出,以及[>%s>]或者[>$n>]将该位置的域中的字符转化为大写字符输出。
7.4 AE自带的格式化参数
系统提供了几个自带的格式化参数,通过[ae format]指令可以查看全部的格式化参数。每个格式化字符串系统都给起了一个别名,我们可以直接输入别名作为参数,也可以直接输入格式化字符串作为参数。例如[ae 0 strcpy]跟[ae 0 “strcpy(%s,%s);”]两个指令是完全等价的。
下图展示了系统自带的格式化字符串memset使用过程。
/lidp>ae format
memset "memset(%s,0x0,sizeof(%s));"
strcpy "strcpy(%s,%s);"
strncpy "strncpy(%s,%s,sizeof(\$1)-1);"
printf "printf(\"%%s\$n\",%s);"
sprintf "sprintf(%s,\"%%s\",%s);"
cond1 "<!if(c1)then{f1}elif([c2])then{f2}else{f3}!>"
cond2 "<!if([ -vie 1 c1 ]&&[ -vie 2 c2 ]||[-vie 3c3 ])then{f1}elif(c2)then{f2}else{f3}!>"
cond2 "<!if([ -vie 1 c1 ]&&[ -vie 2 c2 ]||[-vie 3c3 ])then{f1}elif(c2)then{f2}else{f3}!>"
/lidp>ae s cat
user_name char 32 用户名
user_sex char 1 性别
user_phoneno char 16 手机号码
/lidp>ae 1 memset
memset(user_name ,0x0,sizeof(user_name ));
memset(user_sex ,0x0,sizeof(user_sex ));
memset(user_phoneno,0x0,sizeof(user_phoneno));
/lidp>ae 1 "memset(%s,0x0,sizeof(%s));"
memset(user_name ,0x0,sizeof(user_name ));
memset(user_sex ,0x0,sizeof(user_sex ));
memset(user_phoneno,0x0,sizeof(user_phoneno));
/lidp>ae 1 "memset(%s,0x0,sizeof(%s));/* \$4 */"
memset(user_name ,0x0,sizeof(user_name ));/* 用户名 */
memset(user_sex ,0x0,sizeof(user_sex ));/* 性别 */
memset(user_phoneno,0x0,sizeof(user_phoneno));/* 手机号码 */
/lidp>ae 1 "memset(>%s>,0x0,sizeof(>%s>));/* \$3 */"
memset(USER_NAME ,0x0,sizeof(USER_NAME ));/* 用户名 */
memset(USER_SEX ,0x0,sizeof(USER_SEX ));/* 性别 */
memset(USER_PHONENO,0x0,sizeof(USER_PHONENO));/* 手机号码 */
/lidp>ae 1 "memset(>\$1>,0x0,sizeof(>\$1>));/* \$3 */"
memset(USER_NAME ,0x0,sizeof(USER_NAME ));/* 用户名 */
memset(USER_SEX ,0x0,sizeof(USER_SEX ));/* 性别 */
memset(USER_PHONENO,0x0,sizeof(USER_PHONENO));/* 手机号码 */
7.5 域条件判断
上面示例代码中几个域都是字符串,所以使用简单的格式字符串就可以处理。如果域的类型比较复杂,那就必须借助条件判断来实现格式化输出了。
AE工具通过对不同的域提供条件判断支持,来选择不同的格式化处理字符串。条件判断的基本格式为[<!if(c1)then{f1}elif([c2])then{f2}else{f3}!>],该条格式字符串的含义是如果如果当前文本行满足条件[c1]则使用[f1]格式化字符串,如果满足条件[c2]则使用[f2]格式化字符串,否则使用[f3]格式化字符串。
条件字段,条件字段必须用[]括起来,其内容默认最后一个域为条件字符串,其前面一个域用数字表示,代表源数据文本的第几个域,该字段如果为[0]则表示整行文本,其他数字则表示文本的第几个域。这个字段可以为空,默认匹配整行。条件字段最前面可以加上参数,参数可以是[ive]的组合,[i]表示忽略大小写,[v]表示取反,[e]表示整个字段匹配。
单条件字符串,单条件字符串默认含有该字符串,条件前面加上[!]表示不含有该字符串,条件用[<>]括起来表示该字符串不区分大小写,或者组合使用[!<>]表示不区分大小写不包含该字符串。
多条件字符串,即多个单条件字符串组合起来使用。每个单条件字符串外面都要使用[]括起来,多个单条件字符串之间使用[&&]表示并且,[||]表示或者。
单条件字符串跟多条件字符串一起使用,可以满足非常复杂的条件判断。下图展示了条件字段基本语法规则:
条件字符串 含义说明 等价字符串
条件本身
[cond] 整行文本含有cond字符串 [0 cond]
[2 cond] 第2个域含有cond字符串
[-i cond] 整行文本不区分大小写含有cond字符串 [-i 0 cond]
[-i 2 cond] 第2个域不区分大小写含有cond字符串
[-v cond] 整行文本不含有cond字符串 [-v 0 cond]
[-v 2 cond] 第2个域不含有cond字符串
[-e cond] 整行文本等于cond字符串 [-e 0 cond]
[-e 2 cond] 第2个域等于cond字符串
[-iv 2 cond] 第2域不区分大小写不含有cond字符串
[-ie 2 cond] 第2域不区分大小写等于cond字符串
[-ve 2 cond] 第2域不等于cond字符串
[-ive 2 cond] 第2域不区分大小写不等于cond字符串
单条件字符串
c1 该行文本含有字符串c1
!c1 该行文本不含有字符串c1
<c1> 该行文本不区分大小写含有字符串c1
! <c1> 该行文本不区分大小写不含有字符串c1
多条件字符串
[sc1]&&[sc2] 满足条件sc1,并且sc2
[sc1]||[sc2] 满足条件sc1,或者sc2
[sc1]&&[sc2]&&[sc3] 满足条件sc1,并且sc2,并且sc3
[sc1]||[sc2]||[sc3] 满足条件sc1,或者sc2,或者sc3
[sc1]&&[sc2]||[sc3] 满足条件sc1,并且sc2,或者sc3
系统对输出文本也提供了一些特殊语法支持,特殊语法只作用于整行文本,不对具体的域做处理。
下表展示了对输出文本的特殊语法说明。
输出部分格式字符串 含义说明
\$line 该行文本不做任何处理,直接原样输出
{} 该行内容清空,直接换行处理
\$del 该行文本不输出,直接处理下一行
7.6 AE域条件判断用法示例
下面以数据库表字段处理展示了AE格式化字符串的基本功能。通过读取数据库表字段,然后通过条件判断直接生成整齐的数据库表结构体。
#:struct1:sh:para-table_name,desc-生成数据库表的结构体--精确生成
tippara="请输入数据库表名(eg:t_zero_sys_inf)"
para1=$(ae para 1 1)
table=$(echo $para1|head -1|tr "[A-Z]" "[a-z]")
lstable=s$(echo $table|cut -c2-100)
ustable=$(echo $lstable|tr "[a-z]" "[A-Z]")
echo "typedef struct $lstable {"
sqlstr="select trim(lower(a.column_name))||' '||(case when (a.data_type='LONG' or (a.data_type='NUMBER' and nvl(a.data_scale,0)=0)) then 'long' \
when (a.data_type='FLOAT' or a.data_type='NUMBER') then 'double' else 'char' end)||' '\
||(case when a.data_type='DATE' then 8 else nvl(a.data_length,88) end)||' '||\
replace(replace(trim(nvl(b.comments,' ')),' ',''),chr(10),'') from all_tab_columns a,all_col_comments b where 1=1 and a.owner=b.owner \
and a.table_name =upper('$table') and a.table_name =b.table_name and a.column_name=b.column_name order by a.column_id"
ae sql "$sqlstr" >$(ae s)
ae 1 "<!if(-ie 2 char)then{ \$2 \$1[\$3+1]; /* \$4 */}else{ \$2 \$1 ; /* \$4 */}!>"
echo "} $ustable;"
ae s trun
ae d trun
PL4:lidp>ae c struct1 sh
请输入数据库表名(eg:t_zero_sys_inf):t_zero_bal_ctrl
--------------------------------------------------------------------------------
typedef struct s_zero_bal_ctrl {
char fina_code [4 +1]; /* 财政代码 */
char eff_type [1 +1]; /* 额度生效方式标志 */
char bal_id [100+1]; /* 额度ID */
char bdt_item_no [20 +1]; /* 对应预算指标编号 */
char bal_seqno [20 +1]; /* 额度编号 */
char econ_code [20 +1]; /* 经济分类代码 */
char fun_item_no [20 +1]; /* 功能分类科目代码 */
double balance ; /* 额度余额 */
double cur_bal ; /* 可用余额 */
double use_bal ; /* 累计使用余额 */
double tol_bal ; /* 累计发放额度 */
double bak_bal ; /* 备份余额 */
char checkcode [50 +1]; /* 校验码 */
char other [255+1]; /* 预留字段 */
char reserve [60 +1]; /* 备用 */
char reserve1 [60 +1]; /* 预留字段1 */
char reserve2 [60 +1]; /* 预留字段2 */
} S_ZERO_BAL_CTRL;
第8章 AE文件上传和下载
8.1 基本用法说明
用户标签可以通过AE放在一个公共的库文件中,供其他用户下载使用。用户公共的库文件有[z]文件和[z]镜像文件,由于只有管理员才有处理[z]文件标签的权限,所以用户上传和下载只能放在[z]文件的镜像文件。
8.2 用户文件上传
用户可以通过指令[ae load up],将[s]文件中的标签数据上传到[z]镜像文件。如果[z]镜像文件中不存在要上传的标签,则[s]文件内容会自动追加到[z]镜像文件。如果[z]镜像文件存在同名标签,且该标签的所有者属于自己,则上传标签会覆盖[z]文件的原有标签内容。如果[z]镜像文件存在同名标签,但该标签的所有者不属于自己,则上传失败。对于上传失败的情形,用户可以更改标签名之后重新上传。
8.3 用户文件下载
用户可以通过指令[ae load cat]查看[z]镜像文件中所有已上传的标签信息,也可以通过[ae load cat hello]搜索含有指定文本内容的信息。如果找到自己想要的文本标签则可以通过[ae load down]命令,根据提示输入标签名下载该标签。这样标签内容就会自动下载保存到[s]临时文件,最后可以通过[ae f s]命令保存标签内容到个人库文件中。
8.4 文件对外发布
如果管理员觉得某个标签对大多数人都非常有用,则可以将该标签从[z]镜像文件下载到个人[s]临时文件,然后通过[ae z s]将该标签保存到[z]文件中。由于普通用户都有查看和使用[z]文件标签的权限,管理员将文本标签保存到[z]文件即相当于将该标签文本对外发布。标签一旦发布出来,普通用户就可以像使用普通标签一样使用该标签文本。
8.5 常用指令汇总
条件字符串 含义说明 等价命令
ae load 查看文件上传下载功能用法 ae help load
ae load up 上传文件标签到[z]镜像文件
ae load cat 查看[z]镜像文件中所有已上传的标签信息
ae load cat hello 查看[z]镜像文件中含有hello的标签信息
ae load down 下载[z]镜像文件标签脚本到[s]临时文件
ae z s 管理员将下载的标签文本对所有用户发布
Ae b s 将下载的标签文本保存在个人[b]库文件中
Ae f s 将下载的标签文本保存在个人[f]库文件中
第9章 AE数据库访问
9.1 AE数据库访问
通过AE访问数据库跟普通脚本访问数据库没有任何区别,只是对输出数据的处理上存在差异。AE访问数据库的目的是获得数据源,以便将数据用于其他用途。
通过[ae sql sqlstring]命令可以运行任意数据库语句,运行结果会直接输出在屏幕。
通过[ae tb tablename]可以查询任意数据库表字段的基本信息,包括字段名,字段类型,字段长度及字段说明。由于查询数据库表字段是我们最常用的操作,所以工具对这个操作安排了专门的操作指令。
通过[ae cal calstring]命令可以计算任何数学表达式的值,其原理就是调用数据库的查询计算语句,然后将计算结果输出在屏幕。
其他复杂的数据库处理,只能由用户自己通过标签脚本调用这几个接口来实现。
9.2 常用指令汇总
ae sql t_table_name 查看表结构
ae sql sql_str 运行数据库语句
第10章 AE项目开发演示
10.1 整体说明
基于AE的项目开发,即让[ae]工具参与到项目开发的各个环节。通过AE的文本和脚本管理方法,提高项目的开发效率。
10.2 需求开发计划
10.2.1 传统需求开发计划**
需求开发计划即需求开发的总体规划,一般包括需求文件内容,需求涉及到的接口文件内容,需求开发测试的过程笔记,以及最终提交的源码清单。传统的做法是创建一个私人目录,将业务相关的文档存放在里面。开发过程中涉及到的"源码清单",运行的"sql语句"以及其他数据都用文档保存,也放在这个目录中。
这种做法很常见,但缺点也很明显。
1. 管理麻烦
对每个需求创建一个私人目录,如果需求很多,就会出现一大堆私人目录,管理起来就比较混乱。时间久了,对每个目录放了什么文件,开发者自己都不清楚了。
2. 查询使用麻烦
对于一些已经上线的需求,如果要查询某个具体的业务点,就必须打开私人目录一个一个文件查找。如果时间比较紧或者查询的问题比较急迫,查找起来就会手忙脚乱。
3. 升级迭代麻烦
如果由于项目变动或者其他原因,自己开发的需求必须交给别的项目成员。如果接收人收到的是一大堆项目文件组成的压缩包,这个时候熟悉项目就会变成一件非常困难的事情,甚至根本找不到人接手。这样项目经过几次转手之后,最后总会造成大量的文件丢失,或者让项目文档变得难以理解。通常接收人与其去翻阅一大堆文件,不如自己去一行一行审阅代码。
10.2.2 基于AE的需求开发计划
通过AE的文件管理功能,上面的问题就比较容易解决。对AE用户来说,一个需求计划就是一个需求标签。用户只需要创建一个简单的需求标签,然后在标签描述中注明需求编号名称等基本信息,最后就可以通过这个标签文本来管理整个需求了。
需求计划标签一般存放在用户[f]库文件,根据需求开发的不同模块将整个需求计划标签设置几个子标签。通常的做法是将需求计划划分为"源码清单",“开发测试”,“需求文档”,"接口文档"几个部分。然后在这几个模块中,根据需求开发不同阶段要求,分别对需求开发数据进行管理。
1.源码清单,
源码清单用来存放需求开发过程中修改的文件、配置参数等信息,这个部分是最终上线的依据,也是上线清单的主要来源。每修改一个文件就在源码清单中将文件列出来,这样可以有效防止文件遗漏。最后文件入库之后,还可以将源码清单作为入库检查脚本的数据源,通过一条单独的指令就可以检查所有入库文件是否入库成功了。
2.开发测试过程笔记
开发测试过程笔记是对整个需求各个功能点开发过程的记录,养成记录过程笔记的习惯能够让整个开发过程条例清晰。过程笔记记录的目的是防止有功能点被遗漏,另外也为了以后问题查询提供方便。测试笔记可以记录测试参数等信息,如果上线功能有瑕疵,也可以通过测试笔记迅速还原测试场景,发现问题也会成为非常简单的事情。
3.需求文档
客户一般会提供excel或者word需求文档,把文档内容直接复制过来就可以了。开发之前可以在这部分对将要实现的各个功能点做好细分,对一些重要的功能点做好标记,然后就可以对各个功能点单独开发了。
4. 接口文档
这个部分一般存放需求涉及到的接口文档,数据库表,业务原始参数数据等。这部分内容如果涉及到的接口文档比较大,则可以通过设置2级子标签来将文档划分为几个大的模块。另外还可以借助AE文本对齐功能,将一些重要的信息,如交易码、报文接口、数据库表、业务参数等信息进行文本对齐,方便后续查找和使用。
10.2.3 AE需求开发计划样例单
下面是一份普通的需求计划单,计划单只摘取了重要部分用于展示。标签名用的"地区码"加上"需求顺序号"组成。标签类型"require"即"需求",标签描述用的需求在windows系统的全路径目录名,其中包含了需求编号和需求名称等信息。这样设置标签的好处是以后可以通过[ae f cat require]查看所有需求,或者通过[ae f cat 0072]查看该地区的所有需求。
#:0072_5:requre:G:\2018req\20180151-黄埔区授权支付项目需求(2018年3月2日)
--------------------------------------------------------------------------------
--:1:源码清单
--------------------------------------------------------------------------------
1.前置
......
2.前端
......
3.后台
......
--------------------------------------------------------------------------------
--:2:开发测试
--------------------------------------------------------------------------------
1.代扣费
......
2.定期借记及集中代付
......
3.0510
......
<此处省略100行>
......
--------------------------------------------------------------------------------
--:3:<<需求信息--黄埔区授权支付项目需求(2018年3月2日)>>
--------------------------------------------------------------------------------
需求详细信息
......
<此处省略50行>
......
--------------------------------------------------------------------------------
--:4:需求42/<<附件:黄埔支行授权支付项目需求>>
--------------------------------------------------------------------------------
需求详情:
......
<此处省略400行>
......
--------------------------------------------------------------------------------
10.3 需求开发
10.3.1 整体说明
需求开发即需求单上各个功能点的实现过程,基于AE的需求开发过程跟传统开发过程没有什么不同,只是在具体开发细节上给出了一套自己的解决方案。下面给出具体开发中遇到的问题,以及基于AE的解决方案。
10.3.2 基于AE的文件查找
在开发过程中经常涉及到文件或者函数等文本信息查找,如果对系统不是非常熟悉就需要对信息做全局查找,这样查找的速度是非常慢的。全局查找搜索的范围比较大,其中查找的绝大多数目录都是我们用不到的,我们可以通过AE脚本对这个问题进行优化。
1.设定查找范围
我们把自己用到的目录配置在一个标签里面,然后通过AE脚本在这个标签配置的目录中查找。整个查找功能脚本实现起来不过几行指令,但查找速度基本都是秒级的。
PL3:/lidp >ae b cat searchdir
#:searchdir:常用的代码目录
2.指定查找类型
另外通过一个查找脚本可以衍生出多个查找脚本,可以实现按照文件类型查找,比如查找[.pc]文件,查找[.h]文件等。通过建立多个命令就可以尽量避免找到不必要的信息,查找的目的性就更强一些。
指定文件类型查找文本内容:
PL3:/lidp/etc>ae b cat search1
#:search1:sh:para-fieldtype,desc-查找.pc文件中的关键字
PL3:/lidp/etc>ae b cat search2
#:search2:sh:para-fieldtype,desc-查找.h文件中的关键字
3.建立全局连接
最后对于一些特别常用的命令,可以直接在系统bin目录或者shbin目录创建全局链接,这样就不用输入ae直接输入单指令就可以查找文件了。
单指令查找:
lss -> /lidp/priv/zsp/autoeasy/lss.sh
vis -> /lidp/priv/zsp/autoeasy/vis.sh
4.个性化调整
在lss.sh和vis.sh中直接调用[ae]的查找命令[ae b searchfile sh filename],这样就可以直接通过[lss]和[vis]查看或者打开具体的文件名。这个查询和打开文件是全局的,使用起来非常方便。通过给这两个命令带上第2个参数,可以指定查找打开开发库、测试库还是受控库文件。
例如:
查找文件所在位置:
PL3:/lidp/etc>lss ASDM060.pc
/lidp/src/SDM/ASDM060.pc
PL3:/lidp/etc>lss ASDM060.pc 1
/lidpcs/src/SDM/ASDM060.pc
PL3:/lidp/etc>lss ASDM060.pc 2
/lidptst2/src/SDM/ASDM060.pc
用view编辑器打开文件:
PL3:/lidp/etc>vis ASDM060.pc
PL3:/lidp/etc>vis ASDM060.pc 1
PL3:/lidp/etc>vis ASDM060.pc 2
通过以上几个简单的设置,我们就可以在系统的任何位置都可以随时在1秒钟内查看打开任何文件,效率得到很大提升。
10.3.3 基于AE的代码编辑
1. 单函数编辑
在一个大的文件中进行函数编辑有很多缺陷,比如会限制其他人同时编辑该文件,不能进行整体的字符串替换删除,还有就是无法同时编辑两个以上关联函数。
使用AE进行代码编辑就很容易解决以上问题,我们可以通过指令[ae b getfun sh funname,filename]直接将函数取出放到[s]临时文件,然后通过[ae s vi]指令编辑该函数,修改完毕再通过[ae b setfun sh funname,filename]将函数保存到文件。整个操作过程相当于给每个函数单独分配了内存空间,让我们可以在一个独立的环境进行函数编辑。
由于用户是在自己独立的文件中编辑该函数,所以对其他使用者没有任何影响。同时用户可以在临时文件中随便对函数进行替换操作,不用担心对源文件中的其他函数产生影响。如果要同时编辑多个函数,只需要使用多个[getfun]命令,然后通过[ae s vi]打开多个窗口即可。多函数编辑相当于其他高级语言的IDE工具,避免在同一个文件中进行多函数跳转。
单函数编辑最长用的情况是,拷贝现有函数经过特殊处理改造成一个新函数。这样在[setfun]的时候就只是将当前函数追加到源文件末尾,不用担心对源函数产生任何影响。即可是覆盖当前文件函数,也可以在[setfun]标签脚本中进行非常严格的检查,不会出现任何差错。
2. 代码辅助信息实时获取
在编辑代码的时候经常需要查询文档以获取各种辅助信息,包括通讯接口字段信息,数据库表结构信息,参数配置信息等。有时还需要对其中某些字段的用法做备注,方便以后查找使用。所有这些操作都会浪费大量的时间,通过AE来做这些事情就简单多了。
通讯接口一般直接在开发计划标签中通过子标签命令[ae f require pg 3]直接获取。
数据库表字段信息可以以数据库表名为标签直接存放在[f]库文件,使用的时候直接通过命令[ae f tablename]就可以实时获取到数据库表结构信息了。
其他参数配置信息一般都存放在系统数据库表中,对每个参数表单独写一个脚本存放在[b]文件,脚本标签名称使用数据库表名,这样任何时候需要查询配置参数,只需要通过一条命令[ae b tablename sh]就可以了。
3. 代码自动生成
通过AE的代码对齐功能可以自动生成一些简单代码,如果要实现一些稍微复杂的逻辑就必须写自己的实现脚本了。借助AE强大的字符串处理功能,实现一些常用且重复量大的工作是非常简单的。
对于写一些常用的变量定义、初始化、去空格、日志打印,文件的打开、遍历、关闭,数据库表的增、删、改、查等等操作,都可以通过一些简单的脚本或者函数来实现。通过这些自动代码脚本的组合使用,一个复杂功能80%以上的代码量都可以自动生成了。然后稍微进行一些小的改动,就可以直接用来测试了。
自动代码生成除了能减少我们的工作量以外,还具备如下优势:
首先是代码比较整体,通过脚本生成代码我们可以加上代码对齐功能,生成的代码一般都是非常整齐的。
其次不会出bug,手写代码经常会有些地方考虑不周,用脚本来写就没有这个问题。即使偶尔出现一个小的bug,只需要修改下脚本,以后自动生成的代码就不会再出现同样的问题了。
最后是代码维护方便,自动生成代码是整齐的,查找问题很方便。另外自动代码生成都遵循一定的规则,不会像手写代码那么随意。所有代码采用统一的模式,后人维护起来就不用投入那么多精力去考虑代码间的差异问题了。
10.3.4 基于AE的代码测试
AE工具使用起来非常灵活和方便,通过AE进行代码测试将是一件非常轻松的事情。通过AE工具可以简单的实现如下功能:
1. 单行代码测试或者单个函数测试
在"1.5.9 AE标签脚本基本用法示例"中,我们列举了通过几个标签和脚本运行c代码的示例。当我们搭建好这个框架之后,以后想测试任何c代码都可以直接通过[ae c hello1]调出函数文本,通过[ae s vi]将要测试的代码赋值到标签中,然后[ae c s]将标签保存,最后通过[ae c hello sh]编译运行c代码。无论在系统的任何地方,只需要几秒钟就可以测试一行代码的执行情况。
这种测试也适用于普通函数,其测试方法跟上面完全一样。如果测试的是项目函数,则可以参照[hello]在我们的[b]文件中拷贝一套相同的框架,然后在makefile中链接上系统库,这样就可以用这种方式测试任何[pc]文件或者函数了。
我们测试的项目越复杂,AE的功能就越能显现出来。并且AE的测试记录是可以保存的,每次测试完只需要把测试部分代码拷贝进一个普通函数,然后注明测试的内容,这样在下次测试的时候只需要调用这个函数即可。
2. 测试报文统一管理
我们经常面对需要发送测试报文的情况,如果采用传统测试方法,我们测试一个较大项目就要建立上百个报文测试文件,每次测试都要从一大堆文件中寻找需要的报文,然后修改测试数据,这个过程是非常痛苦的。
采用AE保存报文就方便多了,我们只需要建立一个普通的报文标签即可。每次查找只需要通过[ae f cat msg]就可以全局搜索自己想要的报文,对同一个类交易的不同报文我们可以通过命名多个标签名来将其全部保存,通过在标签行写一些备注信息,任何时候都可以直接拿出来使用。
3. 报文发送
对大多数项目来说,发送报文的程序大同小异,只是IP和端口略有不同。采用传统方式发送报文,需要记忆一大堆IP端口等数据,即使写在一个函数中也要命名一大堆分支,管理起来非常麻烦。
通过AE发送报文就没有这些烦恼了,我们可以对每个项目的报文发送定一个标签脚本,在脚本中配置IP端口,通过脚本接收发送另外一个标签报文,这样就可以轻松的将报文发送出去了。
当接手一个新的项目的时候,我们只需要将之前写好的脚本拿出来,简单的修改下标签名以及IP和端口等参数将其保存在[b]文件中,这样就可以作为新的项目报文发送脚本了。只需要花费几秒钟的时间就可以迭代出一个新的脚本,并且跟原来发送脚本相互独立,互不影响。
10.4 代码入库
10.4.1 devdiff的不足
开发测试环境提供了devdiff代码入库工具,这个工具只能将一个文件全量入库,使用起来非常不方便。一个好的入库工具应该具备以下特点:
1. 获取文件快照
即在入库的那个时刻,直接获取将要入库文件的快照信息,而不用担心自己在入库的同时还有其他用户在编辑该文件。这就要求工具在入库的时候将该文件拷贝一份出来,然后通过拷贝文件来入库
2. 对每个修改点单独入库
即在入库的时候可以对每个不同点进行单独挑选决定是否入库,这样就可以把自己的修改跟别人的修改分开,把自己不同需求的修改分开,以及把自己的测试代码跟要上线代码分开。
3. 入库中间文件修改
对一个具体的修改点如果不想全量入库,可以先把这个修改点入库到中间文件,然后手动修改中间文件,最后保存退出继续入库下个修改点。如果能够达到这种效果,那么我们基本实现了行级的代码入库,这样就可以快速入库任何复杂的修改了。
4.文件反向入库
即需要把版本库中的修改反过来回退到开发库,由于开发库已经做了别的需求变动,无法直接将版本库中的代码拷贝回来。这样就必须以版本库为基础对开发库进行反向入库处理,最后将入库文件覆盖到开发库。如果能做到这点就不用担心由于先改了生产版本,而不方便同步开发版本的情况。
10.4.2 基于AE的devdiff入库工具
由于工具本身对脚本的运行和维护提供了强大的支持,让AE的devdiff具备上述功能就非常简单。基于AE的devdiff入库脚本,具体每个功能点的实现逻辑如下:
1. 获取文件快照
运行[devdiff]标签脚本的时候将要入库的文件拷贝到[ae home]下的[devdiff]目录即可,然后通过拷贝文件跟版本库文件对比来进行入库处理。
2. 对每个变动点单独入库
我们可以通过diff指令将所有不同点保存在工具的 [a]临时文件,通过脚本一条一条读取[a]中的变动点,分析该变动点是"新增"“修改"还是"删除”,针对每种情况做单独分析处理,如果用户确定实施该变动则读取拷贝文件相应部分追加到[d]临时文件,如果不实施则读取测试库文件的拷贝文件追加到[d]临时文件。这样就可以针对每个变动点单独入库,相比手工处理节省大量时间。
4. 入库中间文件修改
由于入库的中间文件都保存在[d]临时文件,如果针对某个变动点需要做局部改动,则可以通过[ae d vi]指令打开中间文件,然后跳转到文件最后进行修改处理,处理完保存文件即可。然后继续处理下个变动点,让下一部分信息继续追加到[d]文件,直到整个文件的中间镜像文件创建完毕。
5. 文件反入库
文件反入库跟正向入库的不同点就是在挑选文件的时候,如果版本库文件的变动选择"否",如果是开发库的变动选择"是",最后将结果文件[d]拷贝覆盖开发库文件即可。
10.4.3 基于AE的devdiff使用指引
通过[ae b devdiff sh]命令即可运行改进后的[devdiff]工具,然后在需要入库的文件所在目录输入文件名[ASDM131.pc],然后工具读取该文件进入该文件入库的主界面。工具提供的功能点较多,目的是为了应对各种复杂情况的入库处理。其中最常用的是3、4、5、6这几个命令。
3-挑选对比创建镜像文件。镜像文件即[d]文件,输入这条指令就可以一条一一条读取[a]文件的不同点,根据用户输入确认信息就可以进行单个不同点分别入库了。
4-镜像文件入库。即生成[d]文件的开发库备份脚本以及测试库的入库脚本,通过简单的[cp]拷贝命令即可实现完美入库。
5-对比测试与镜像文件。通过这个命令可以查看3处理后测试版本跟镜像文件的不同。
6-对比镜像与开发。通过这个命令可以查看3处理后镜像文件跟开发文件的不同。
PL3:/lidp>ae b devdiff sh
请输入当前目录的文件名(eg:ASDM120.pc):ASDM131.pc
--------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
#------------------------------:【主界面】:-------------------------------------
#--:1.对比测试与开发,2-挑选对比输出到s文件,3-挑选对比创建镜像文件d,4-镜像文件入库
#--:5-对比测试与镜像,6-对比镜像与开发,7-查看指令集,8-手动修改指令集
#--:9-根据指令集进行2操作,0-根据指令集进行3操作
#--:s-查看s文件,a-查看a文件,d-查看d文件,c-查看测试库文件,k-开发库文件,h-查看帮助,q-退出工具
#-------------------------------------------------------------------------------
10.4.4 基于AE的devdiff工具上传下载与分享
一个好的工具只有分享给更多用户使用,才能提高整个团队的工作效率。基于AE的devdiff工具的上传下载与分享,跟普通标签的这个功能并没有任何区别。这里只是结合具体的工作场景来讲解其用法,以便能把问题讲的更清楚一些。
1. 工具上传
当开发完[devdiff]工具并通过测试验证,这个时候可以将该工具上传到[z]镜像库文件,供其他用户下载使用。用户先通过[ae b devdiff]将工具脚本拿到自己的[s]临时文件,然后通过[ae load up]命令将该标签上传到[z]镜像文件。
2.工具下载
其他用户可以通过[ae load cat]命令查看到该工具的概要信息,然后通过[ae load down]命令按照提示输入工具名称,[devdiff]就可以将工具脚本下载到自己的[s]临时文件。最后通过[ae b s]命令将工具脚本存放到自己的库文件,这样就可以通过[ae b devdiff sh]使用该工具了。
由于每个用户的用户文件都是独立的,新的用户在使用的devdiff工具跟其他用户使用的不是同一个,只是运行的代码相同罢了。新的用户在下载到个人文件之后,可以对该脚本进行任何形式的改造,以便让其以更加适合自己的方式来运行。
3. 工具分享
如果大多数使用者都觉得该工具很好用,这时就可以通知管理员将工具分享给所有人。管理员先通过[ae load down]指令将工具脚本下载到自己的[s]临时文件,然后通过[ae z s]将工具脚本上传到[z]库文件。这样所有用户都可以通过[ae z cat]指令查看到该工具,并且可以使用[ae z devdiff sh]运行该脚本程序进行入库处理。
10.5 上线版本检查
10.5.1 整体说明
由于上线时间相对比较紧迫,用肉眼去检查代码是一件非常痛苦的事情。特别是如果上线的内容比较多,人工检查就非常容易遗漏。我们检查文件不外乎检查文件是否已经入库,测试库跟受控库文件是否相同,如果是库文件是否已经编译出动态或者静态库,如果是可执行程序是否已经编译出了可执行程序,以及配置文件跟数据库参数等是否齐全。由于检查的每一项都很明确,所以就可以通过标签脚本来实现这些检查功能。
10.5.2 AE自动化版本检查
我们每个人负责的项目范围都比较狭窄,项目代码基本都只存在几个具体的目录中,每个目录目录的作用也非常明确,这样我们就可以根据目录来将上线文件分类,通过脚本函数对每个目录中的上线文件进行单独检查,并把检查的结果输出在屏幕。如果检查中怀疑文件可能有问题,那就打印出警告信息,否则就打印出检查通过信息。
我们的工作就是把所有上线文件复制到[s]临时文件,然后修改下格式让其能够被我们的检测脚本识别。如果我们在做需求计划的源码清单的时候,本来就是按照版本检查的数据格式填写的,那么就可以直接运行脚本程序,分分钟完成所有代码的检查工作。
下面展示了一个普通的代码检测过程及效果:
PL3:/lidp/priv/zsp/H002>ae s cat
fmt:
zero_hp_notice_tail.fmt
zero_pay_list_0072.fmt
SDM:
ASDM119.pc
ASDM128.pc
PL3:/lidp/priv/zsp/H002>ae b check sh
请输入上线日期(def:20180523):20180530
--------------------------------------------------------------------------------
------------------------【所有文件比较,相同为1,不同为0】------------------------
[fmt:]:
[zero_hp_notice_tail.fmt]:
-rw-r--r-- 1 lidp oinstall 308 May 29 14:49 /lidp/fmt/zero_hp_notice_tail.fmt
-rw-r--r-- 1 lidpcs oinstall 308 May 29 17:54 /lidpcs/fmt/zero_hp_notice_tail.fmt
-rw-r--r-- 1 lidptst2 oinstall 308 May 29 17:55 /lidptst2/fmt/zero_hp_notice_tail.fmt
-rw-r--r-- 1 lidptst2 oinstall 308 May 29 17:55/lidptst2/update/20180530/upd/fmt/zero_hp_notice_tail.fmt
zero_hp_notice_tail.fmt]:上线与受控:1,受控与测试:1,测试与开发:1
[zero_pay_list_0072.fmt]:
-rwxr-xr-x 1 lidp oinstall 2629 May 14 14:56 /lidp/fmt/zero_pay_list_0072.fmt
-rwxr-xr-x 1 lidpcs oinstall 2629 May 25 09:29 /lidpcs/fmt/zero_pay_list_0072.fmt
-rwxr-xr-x 1 lidptst2 oinstall 2629 May 29 17:55 /lidptst2/fmt/zero_pay_list_0072.fmt
-rwxr-xr-x 1 lidptst2 oinstall 2629 May 29 17:56/lidptst2/update/20180530/upd/fmt/zero_pay_list_0072.fmt
zero_pay_list_0072.fmt]:上线与受控:1,受控与测试:1,测试与开发:1
[SDM:]:
-rwxr-xr-x 1 lidp oinstall 11433805 May 31 10:19 /lidp/lib/libappSDM.so
-rwxr-xr-x 1 lidpcs oinstall 10845014 May 30 08:46 /lidpcs/lib/libappSDM.so
-rwxr-xr-x 1 lidptst2 oinstall 10516792 May 30 10:01 /lidptst2/lib/libappSDM.so
-rwxr-xr-x 1 lidptst2 oinstall 10516792 May 30 11:32/lidptst2/update/20180530/upd/lib/libappSDM.so
[libappSDM.so]:上线与受控:1,受控与测试:0,测试与开发:0
[ASDM119.pc]:
-rwxr-xr-x 1 lidp oinstall 92113 May 29 14:52 /lidp/src/SDM/ASDM119.pc
-rwxr-xr-x 1 lidpcs oinstall 91942 May 29 17:56 /lidpcs/src/SDM/ASDM119.pc
-rwxr-xr-x 1 lidptst2 oinstall 91942 May 29 17:57 /lidptst2/src/SDM/ASDM119.pc
[ASDM119.pc]:受控与测试:1,测试与开发:0
[ASDM128.pc]:
-rwxr-xr-x 1 lidp oinstall 186646 May 29 15:07 /lidp/src/SDM/ASDM128.pc
-rwxr-xr-x 1 lidpcs oinstall 186592 May 29 17:57 /lidpcs/src/SDM/ASDM128.pc
-rwxr-xr-x 1 lidptst2 oinstall 186592 May 29 17:57 /lidptst2/src/SDM/ASDM128.pc
[ASDM128.pc]:受控与测试:1,测试与开发:0
10.6 AE项目生态圈
10.6.1 总体说明
AE项目生态即一群使用AE进行项目开发的人,不断改进开发脚本提高整个团队开发效率的过程。我们每个人在使用AE进行项目开发的时候,都会不自觉的写出一大堆脚本来。这些脚本中绝大多数都可以跟其他人共享,如果我们每个人都专注于自己熟悉模块的开发,然后分享给大家一起使用,通过用户问题反馈对脚本不断更新完善,最终将形成一套完美的开发工具。这样项目组成员都使用这套工具进行项目开发,那么节省的开发时间将非常可观。
10.6.2 脚本升级
用AE开发出的脚本程序是可以不断升级的,我们不仅可以拷贝现有脚本改造成一个新的脚本,还可以通过脚本生成另外一个脚本。当一个脚本经过几次迭代之后,脚本的功能将会变得非常强大,运行效率也会得到很大提高。这些通过一个人的力量是很难实现的,也缺乏升级的动力。如果在一个生态圈中,大家一起对脚本进行优化改进,不仅成本低,而且效果也会非常好。
10.6.3 AE无处不在
当我们已经习惯于用脚本开发程序,那么我们做每件事情的时候会优先考虑,是否可以通过脚本来实现。当我们工作的每个环节都可以用脚本来完成的时候,我们就彻底摆脱了单调的工作,让我们的时间用在更有利于个人价值提高的事情上来。
第11章 AE应用开发
11.1 AE自动化编程
11.1.1 总体说明
把一些常用代码编写做成一个单独的模版,把代码涉及到的变量信息作为数据源,然后通过脚本自动生成项目代码。
11.1.2 变量定义初始化及日志打印
在s文件配置变量名称,类型,大小,描述信息,让脚本读取该信息生成相关代码。
11.1.3 文件打开遍历关闭
在s文件配置文件变量名称,打开方式,操作类型,让脚本读取该信息生成相关代码。
11.1.4 数据库表增删改查及游标使用
在s文件配置数据库表名称,使用方式,关联信息,让脚本读取该信息生成相关代码。
11.2 AE绘图
11.2.1 总体说明
目前AE只能运行在unix系统,AE的绘图也只能绘制一些简单的文本类型图案。
11.2.2 棋盘报表绘制
手工通过UE绘制报表比较麻烦,通过AE绘制报表速度会快很多。只要我们能通过AE能够识别的指令绘制报表,AE就能按照我们的指令绘制出最理想的图案。
11.2.3 棋盘报表绘制过程演示
1.初始化报表行数和列数
PL4:/lidp/src/SDM>ae b qipan sh
请输入行(def:4):5
请输入列(def:8):10
--------------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 0 1
1┌┬┬┬┬┬┬┬┬┬┐
2├┼┼┼┼┼┼┼┼┼┤
3├┼┼┼┼┼┼┼┼┼┤
4├┼┼┼┼┼┼┼┼┼┤
5├┼┼┼┼┼┼┼┼┼┤
6└┴┴┴┴┴┴┴┴┴┘
#-------------------------------------------------------------------------------
2.设置报表的行宽和列宽
#------------------------------:【主界面】:-------------------------------------
#--:1-调整行数列数及行宽列宽,2-绘制图形样式,3-设置图像文本,4-打印图像信息
#--:s-设置打印,p-打印图像,q-退出程序
#-------------------------------------------------------------------------------
请输入指令:1
--------------------------------------------------------------------------------
┌┬┬┬┬┬┬┬┬┬┐
├┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┼┼┤
└┴┴┴┴┴┴┴┴┴┘
#-------------------------------------------------------------------------------
#--:1-调整行宽,2-调整列宽,3-调整行数,4-调整列数,5-初始化图形
#--:s-设置打印方式,p-打印图形,q-退出,exit-退出程序
#-------------------------------------------------------------------------------
请选择操作类型:1
--------------------------------------------------------------------------------
------------------:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
当前行宽参数 :0 0 0 0 0
请输入新的行宽参数:1 2 1
--------------------------------------------------------------------------------
┌┬┬┬┬┬┬┬┬┬┐
│││││││││││
├┼┼┼┼┼┼┼┼┼┤
│││││││││││
│││││││││││
├┼┼┼┼┼┼┼┼┼┤
│││││││││││
├┼┼┼┼┼┼┼┼┼┤
│││││││││││
├┼┼┼┼┼┼┼┼┼┤
│││││││││││
└┴┴┴┴┴┴┴┴┴┘
#-------------------------------------------------------------------------------
#--:1-调整行宽,2-调整列宽,3-调整行数,4-调整列数,5-初始化图形
#--:s-设置打印方式,p-打印图形,q-退出,exit-退出程序
#-------------------------------------------------------------------------------
请选择操作类型:2
--------------------------------------------------------------------------------
------------------:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
当前列宽参数 :0 0 0 0 0 0 0 0 0 0
请输入新的列宽参数:1 2 1
--------------------------------------------------------------------------------
┌─┬──┬─┬─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │ │ │
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │
└─┴──┴─┴─┴─┴─┴─┴─┴─┴─┘
#-------------------------------------------------------------------------------
#--:1-调整行宽,2-调整列宽,3-调整行数,4-调整列数,5-初始化图形
#--:s-设置打印方式,p-打印图形,q-退出,exit-退出程序
#-------------------------------------------------------------------------------
请选择操作类型:q
#-------------------------------------------------------------------------------
3.合并单元格
#------------------------------:【主界面】:-------------------------------------
#--:1-调整行数列数及行宽列宽,2-绘制图形样式,3-设置图像文本,4-打印图像信息
#--:s-设置打印,p-打印图像,q-退出程序
#-------------------------------------------------------------------------------
请输入指令:2
--------------------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 0 1
1┌┬┬┬┬┬┬┬┬┬┐
2├┼┼┼┼┼┼┼┼┼┤
3├┼┼┼┼┼┼┼┼┼┤
4├┼┼┼┼┼┼┼┼┼┤
5├┼┼┼┼┼┼┼┼┼┤
6└┴┴┴┴┴┴┴┴┴┘
#-------------------------------------------------------------------------------
#--:3p-调整边线,4p-合并单元格,h-查看帮助信息,s-设置打印,p-打印图像,q-退出,exit-退出程序
#--: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14
#--:┌,┬,┐,├,┼,┤,└,┴,┘,─,│,@@
#-------------------------------------------------------------------------------
请输入指令:1 1 1 2,1 3 1 5,1 6 1 10
1 2 3 4 5 6 7 8 9 0 1
1┌─┬──┬────┐
2├┬┼┬┬┼┬┬┬┬┤
3├┼┼┼┼┼┼┼┼┼┤
4├┼┼┼┼┼┼┼┼┼┤
5├┼┼┼┼┼┼┼┼┼┤
6└┴┴┴┴┴┴┴┴┴┘
#-------------------------------------------------------------------------------
#--:3p-调整边线,4p-合并单元格,h-查看帮助信息,s-设置打印,p-打印图像,q-退出,exit-退出程序
#--: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14
#--:┌,┬,┐,├,┼,┤,└,┴,┘,─,│,@@
#-------------------------------------------------------------------------------
请输入指令:5 1 5 10
1 2 3 4 5 6 7 8 9 0 1
1┌─┬──┬────┐
2├┬┼┬┬┼┬┬┬┬┤
3├┼┼┼┼┼┼┼┼┼┤
4├┼┼┼┼┼┼┼┼┼┤
5├┴┴┴┴┴┴┴┴┴┤
6└─────────┘
#-------------------------------------------------------------------------------
#--:3p-调整边线,4p-合并单元格,h-查看帮助信息,s-设置打印,p-打印图像,q-退出,exit-退出程序
#--: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14
#--:┌,┬,┐,├,┼,┤,└,┴,┘,─,│,@@
#-------------------------------------------------------------------------------
请输入指令:p
--------------------------------------------------------------------------------
┌────┬─────┬─────────┐
│ │ │ │
├─┬──┼─┬─┬─┼─┬─┬─┬─┬─┤
│ │ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │ │ │
├─┴──┴─┴─┴─┴─┴─┴─┴─┴─┤
│ │
└────────────────────┘
#-------------------------------------------------------------------------------
4.设置显示样式
#--:3p-调整边线,4p-合并单元格,h-查看帮助信息,s-设置打印,p-打印图像,q-退出,exit-退出程序
#--: 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14
#--:┌,┬,┐,├,┼,┤,└,┴,┘,─,│,@@
#-------------------------------------------------------------------------------
请输入指令:q
#-------------------------------------------------------------------------------
#------------------------------:【主界面】:-------------------------------------
#--:1-调整行数列数及行宽列宽,2-绘制图形样式,3-设置图像文本,4-打印图像信息
#--:s-设置打印,p-打印图像,q-退出程序
#-------------------------------------------------------------------------------
请输入指令:4
#-------------------------------------------------------------------------------
#--:1-设置显示方式,2-打印图像,3-打印图像到临时文件,4-打印图像参数
#--:5-打印图形参数到s文件,6-读取s图像参数信息到工具,7-打印图像及参数到s文件
#--:q-退出,exit-退出程序
#-------------------------------------------------------------------------------
请选择操作类型:1
--------------------------------------------------------------------------------
------------------:1-空格显示/2-空格显示为@/3-套打显示/4-一级打印/5-一级套打/6-二级打印
当前显示方式 :1
请输入新的显示方式:2
--------------------------------------------------------------------------------
┌────┬─────┬─────────┐
│@@@@@@@@│@@@@@@@@@@│@@@@@@@@@@@@@@@@@@│
├─┬──┼─┬─┬─┼─┬─┬─┬─┬─┤
│@@│@@@@│@@│@@│@@│@@│@@│@@│@@│@@│
│@@│@@@@│@@│@@│@@│@@│@@│@@│@@│@@│
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│@@│@@@@│@@│@@│@@│@@│@@│@@│@@│@@│
├─┼──┼─┼─┼─┼─┼─┼─┼─┼─┤
│@@│@@@@│@@│@@│@@│@@│@@│@@│@@│@@│
├─┴──┴─┴─┴─┴─┴─┴─┴─┴─┤
│@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@│
└────────────────────┘
#-------------------------------------------------------------------------------
5.打印图形映射参数标签信息
#--:1-设置显示方式,2-打印图像,3-打印图像到临时文件,4-打印图像参数
#--:5-打印图形参数到s文件,6-读取s图像参数信息到工具,7-打印图像及参数到s文件
#--:q-退出,exit-退出程序
#-------------------------------------------------------------------------------
请选择操作类型:4
--------------------------------------------------------------------------------
--:row:5:1 2 1 1 1:行数及行宽
--:list:10:1 2 1 1 1 1 1 1 1 1:列数及列宽
--:change:1 1 1 2,1 3 1 5,1 6 1 10,5 1 5 10:图像变换指令
--:left:0:左边距
--:up:0:上边距一级文本
--:up2:上边距二级文本
--:one:5:表格一级文本
[01]:
[02]:
[03]:
[04]:
[05]:
--:two:5:表格二级文本
[01]:
[02]:
[03]:
[04]:
[05]:
--:down:0:下边距一级文本
--:down2:0:下边距二级文本
#-------------------------------------------------------------------------------
#--:1-设置显示方式,2-打印图像,3-打印图像到临时文件,4-打印图像参数
#--:5-打印图形参数到s文件,6-读取s图像参数信息到工具,7-打印图像及参数到s文件
#--:q-退出,exit-退出程序
#-------------------------------------------------------------------------------
请选择操作类型:q
#-------------------------------------------------------------------------------
#------------------------------:【主界面】:-------------------------------------
#--:1-调整行数列数及行宽列宽,2-绘制图形样式,3-设置图像文本,4-打印图像信息
#--:s-设置打印,p-打印图像,q-退出程序
#-------------------------------------------------------------------------------
请输入指令:
11.3 AE算法
11.3.1 总体说明
通过AE脚本可以轻松实现各种复杂 算法,由于目前项目用到的算法都非常简单,自己可以设定算法场景,让AE去实现。
11.3.2 发红包
通过随机数然后通过读取[ae user]数据,可以很方便的实现红包的生成与分配。
参考源码:
#:hongbao:game:红包算法游戏
--------------------------------------------------------------------------------
--:1:sh:钱选人,算法复杂度=金额*100 -- 速度慢
--------------------------------------------------------------------------------
tippara="请输入金额(def:10),请输入红包数量(def:5)"
para1=$(ae para 1 1)
para2=$(ae para 1 2)
amt=$(echo $para1|awk -F, '{printf "%d",$1*100}')
num=$para2
function rand
{
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000))
echo $(($num%$max+$min))
}
if [ $amt -lt $num ];then
echo "para err!"
exit 0
fi
i=1
while [ $i -le $num ]
do
eval money$i=1
i=$(expr $i + 1)
done
i=1
while [ $i -le $(expr $amt - $num) ]
do
j=$(rand 1 $num)
eval money$j=$(eval echo "\$money$j"|awk '{printf "%d",$1+1}')
i=$(expr $i + 1)
done
i=1
while [ $i -le $num ]
do
eval echo "$i,\$money$i"|awk -F, '{printf "第%3s 个红包,金额:%6.2f 元\n",$1,$2/100}'
i=$(expr $i + 1)
done
--------------------------------------------------------------------------------
--:2:sh:人选钱,算法复杂度=红包数量 -- 不是完全的随机
--------------------------------------------------------------------------------
tippara="请输入金额(def:10),请输入红包数量(def:5)"
para1=$(ae para 1 1)
para2=$(ae para 1 2)
amt=$(echo $para1|awk -F, '{printf "%d",$1*100}')
num=$para2
function rand
{
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000))
echo $(($num%$max+$min))
}
if [ $amt -lt $num ];then
echo "para err!"
exit 0
fi
amt=$(expr $amt - $num)
i=1
t=0
while [ $i -le $num ]
do
j=$(rand 1 $(expr $num \* 10))
eval money$i=$j
t=$(expr $t + $j)
i=$(expr $i + 1)
done
i=1
n=0
while [ $i -lt $num ]
do
fenshu=$(eval echo "\$money$i")
m=$(echo $amt,$fenshu,$t|awk -F, '{printf "%.2f",$1*($2/$3)/100}')
n=$(echo $m,$n|awk -F, '{printf "%.2f",$1+$2}')
echo $i,$m|awk -F, '{printf "第%3s 个红包,金额:%6.2f 元\n",$1,$2+0.01}'
i=$(expr $i + 1)
done
m=$(echo $amt,$n|awk -F, '{printf "%.2f",$1/100-$2}')
echo $num,$m|awk -F, '{printf "第%3s 个红包,金额:%6.2f 元\n",$1,$2+0.01}'
--------------------------------------------------------------------------------
--:3:sh:人选钱,剩下的钱选人 算法复杂度:红包数量+1
--------------------------------------------------------------------------------
tippara="请输入金额(def:10),请输入红包数量(def:5)"
para1=$(ae para 1 1)
para2=$(ae para 1 2)
amt=$(echo $para1|awk -F, '{printf "%d",$1*100}')
num=$para2
function rand
{
min=$1
max=$(($2-$min+1))
num=$(($RANDOM+1000000000))
echo $(($num%$max+$min))
}
if [ $amt -lt $num ];then
echo "para err!"
exit 0
fi
amt=$(expr $amt - $num)
i=1
t=0
while [ $i -le $num ]
do
j=$(rand 1 $(expr $num \* 10))
eval money$i=$j
t=$(expr $t + $j)
i=$(expr $i + 1)
done
i=1
n=0
while [ $i -le $num ]
do
fenshu=$(eval echo "\$money$i")
m=$(echo $amt,$fenshu,$t|awk -F, '{printf "%d",$1*($2/$3)}')
n=$(echo $m,$n|awk -F, '{printf "%d",$1+$2}')
eval ren$i=$m
i=$(expr $i + 1)
done
i=1
j=$(expr $amt - $n)
while [ $i -le $j ]
do
k=$(rand 1 $num)
eval ren$k=$(eval echo "\$ren$k"|awk '{printf "%d",$1+1}')
i=$(expr $i + 1)
done
i=1
while [ $i -le $num ]
do
mm=$(eval echo "\$ren$i"|awk '{printf "%.2f",($1+1)/100}')
echo $i,$mm|awk -F, '{printf "第%3s 个红包,金额:%6.2f 元\n",$1,$2}'
i=$(expr $i + 1)
done
--------------------------------------------------------------------------------
11.3.3 AE三打十五
通过AE实现三大食物游戏算法。(待完善)
11.3.4 AE简笔画
通过AE实现flash算法。(待完善)
11.3.5 AE象棋
通过AE实现象棋算法。(待完善)