REXX学习笔记

最近在学习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,ISPEXECISREDIT在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 !