最近在学习Rexx脚本,打算做一些自动化。归纳了些点总结下放在这里以备查询。
一些基本概念
- REXX:
REstructured eXtended eXecutor (REXX) language
扩充结构化执行语言 - REXX中变量无需事前定义
- Debug REXX:用REXX TRACE或者用interactive debug facility来定位error
- SAA Procedures Language:REXX的子集,在TSO/E,CICS,IMS等多种环境中应用
- 要运行REXX exec,必须至少有一种可用的
Host command environments
。默认的是TSO
。还有MVS
,LINK
,LINKMVS
,LINKPGM
,ATTACH
,ATTCHMVS
,ATTCHPGM
,ISPEXEC
,ISREDIT
,CONSOLE
,CPICOMM
,LU62
,APPCMVS
等等,常用的有TSO
,ISPEXEC
和ISREDIT
在ISFP下面,基本都提供。用ADDRESS
关键字来改变Host command environment
- 要想用TSO命令调用REXX,必须先构建包含exec的PDS.推荐的PDS格式为: youruid.REXX.EXEC (Userid+any name+exec) ,不然用TSO调用PDS中的REXX程序会报错:
PHASE 1 PROCESSING OF CLIST OR REXX EXEC ENDED ABNORMALLY + ABEND CODE: S213 REASON CODE: 0004 - 可以在非TSO/E编址的环境中调用
IKJTSOEV
来创建TSO/E环境 - REXX的exec里面可以包含TSO/E命令(用引号括起来),即使是只包含TSO/E命令,不仅如此,RExx exec能调用的命令包括TSO/E命令,APPC/MVS calls,MVS module invocations,ISPF commands, ISPF/PDF EDIT commands
- 为了防止和CLISTs不兼容,IBM建议所有的REXX程序都在__第一行__有个注释的REXX字眼
- 如果想让REXX支持双字节编码,那么必须在exec的第一行写上:OPTIONS ETMODE
- REXX大小写不敏感
- 为了解决PULL进来的是小写而
SAY
显示出来的是大写的问题,可以吧PULL改成PARSE PULL。因为language processor在处理之前都会先将所有的character装成大写再处理,用PARSE PULL可以解决这个问题。(ARG也是同理)
SAY "Please type in the name of an animal."
PARSE PULL animal /- 输入小写的- /
SAY animal /- 返回的即是小写的- /
- 一般一行一句instruction,除非遇到逗号和分号。 逗号是用来续行的,分号用来表示一个instruction结束,一般用在一行有多个instruction的时候
如果不希望续行的时候有空格,则需要用
‘||,’
不然只用逗号续行的话会默认添加一个空格:
SAY 'This is' ||,
'a string.'
- 虽然是脚本语言,但编译过的REXX比没有编译过的REXX执行效率更高,因为只需编译一次,系统加载和相应时间减少了
如何执行REXX
1. 在READY的界面上执行
READY
EXEC 'YUORUID.REXX.EXEC(TEST01)'
_2._在任何时候调用TSO TEST01
执行
REXX关键字
SAY
: 向SYSPRINT的output DD发消息PULL
: 从SYSPRINT(终端)的input DD接受消息,实际上是从DATA STACK中取的,用PUSH往DATA STACK中压入一个数据TRACE
: 向SYSTSPRT的output DD发送消息PARSE EXTERNAL
: 从SYSTSIN的input DD接受消息LEAVE
: 跳出循环不做了ITERATE
: 放在DO循环里面,跳过余下指令返回DO,接着往下做EXIT
: 告诉language processor结束exec,不强制用但按惯例推荐用,因为language processor在没有instruction的时候自动结束。EXIT后面可以跟返回参数Label:
: 以冒号结束,常在subroutine和function的时候配合SIGNAL用ARG
: 定义exec的参数 E513472.REXX.EXEC(ADD)PARSE
: 与PULL和ARG等配合使用,为了能显示大小写区分PARSE VAR
: 将一个字符串分割成多个字符串(空格区分) 类似于PARSE VALUE ... WITH
TRACE I
(TRACE Intermediates): 用来debug用的,能显示出具体的每一步执行结果NULL
: language processor会忽略它,单纯只是为了增强可读性ELSE
: 即使ELSE没有东西,也要用NOP。编程规范PROCEDURE
: 用在subroutine定义的时候,保护subroutine里面定义的变量的对外可见性ADDRESS
: 用来改变Host command environment
流程控制
条件指令
IF expression/THEN/ELSE (二选1)
SELECT/WHEN expression THEN instruction/OTHERWISE/END.(多选1)
循环指令
DO I=1 TO 10 BY 2/END
DO FOREVER/END
DO WHILE expression=true/END
DO UNTIL expression=true/END
DO number = 1 TO 10 WHILE quantity < 50 /- 复合循环指令例子- /
中断指令
EXIT
SIGNAL label /- 执行完之后不会像CALL一样会返回控制权
CALL label/RETURN
运算符
- / = \=(不相等) ><(不相等) //(余数) - - (幂) %(商) ==(严格相等) \==(不严格相等) > < >=(大等于) \<(不小于) &(逻辑与) (逻辑非) |(逻辑或) per_cent'%'(百分号表示法,per_cent是数值参数)
50个built-in函数(不全)
- Arithmetic functions: ABS DIGITS FORM FUZZ MAX MIN RANDOM SIGN TRUNC
- Comparison functions: COMPARE DATATYPE SYMBOL
- Conversion functions: B2X C2D C2X D2C D2X X2B X2C X2D /- Binary hex Character Decimal)
- Formatting functions: CENTER/COPIES/FORMAT/JUSTIFY/LEFT/RIGHT/SPACE
- String functions: ABBREV/DELSTR/DELWORD/FIND/INDEX/INSERT/LASTPOS/LENGTH/OVERLAY/ POS/REVERSE/STRIP/SUBSTR/SUBWORD/TRANSLATE/VERIFY/WORD/WORDINDEX
- Miscellaneous functions: ADDRESS/ARG/BITAND/BITOR/BITXOR/CONDITION/DATE/ERRORTEXT/ EXTERNALS/LINESIZE/QUEUED/SOURCELINE/TIME/TRACE/USERID/VALUE/XRANGE
Function和Subroutine区别
CALL subroutine_name argument1, argument2,... /- Subroutine不必要返回值,如果返回的话就是RESULT- /
x = function(argument1, argument2,...) /- Function 必须返回值- /
TSO/E external functions
GETMSG LISTDSI MSG MVSVAR OUTTRAP PROMPT SETLANG STORAGE SYSCPUS SYSDSN SYSVAR
Comments !