skip to content

REXX Snippets

Practical REXX patterns for z/OS automation, TSO commands, and ISPF services.

2 min read 7 snippets 3d ago

REXX Snippets#

Script skeleton#

/* REXX - My script description */
address TSO
arg parm1 parm2

if parm1 = '' then do
  say 'Usage: EX MYSCRIPT parm1 parm2'
  exit 8
end

say 'Processing:' parm1
exit 0

Variables and strings#

name = 'Jay'
count = 42
pi    = 3.14159

/* Concatenation */
msg = 'Hello,' name'!'          /* Hello, Jay! */
msg = 'Hello,' || name || '!'   /* explicit concat */

/* Substring */
s = 'ABCDEFGH'
say substr(s, 3, 4)             /* CDEF */
say left(s, 3)                  /* ABC */
say right(s, 3)                 /* FGH */

/* Length, pos, upper */
say length(s)                   /* 8 */
say pos('DEF', s)               /* 4 */
say translate(s)                /* uppercase */

Conditionals & loops#

/* IF/THEN/ELSE */
if rc = 0 then
  say 'OK'
else if rc = 4 then
  say 'Warning'
else do
  say 'Error RC='rc
  exit rc
end

/* DO loop */
do i = 1 to 10
  say i
end

/* DO WHILE */
do while condition
  ...
end

/* DO UNTIL */
do until rc <> 0
  ...
end

/* DO FOREVER */
do forever
  if done then leave
end

/* SELECT (case) */
select
  when rc = 0 then say 'OK'
  when rc = 4 then say 'Warning'
  otherwise say 'Error' rc
end

TSO commands from REXX#

/* Issue TSO command */
address TSO "LISTCAT ENT('MY.*.DATA')"

/* Allocate a file */
address TSO "ALLOC DA('MY.FILE') SHR"

/* Submit job */
address TSO "SUBMIT 'MY.JCL(MYJOB)'"

/* Check return code */
address TSO "LISTCAT ENT('MY.DATA') ALL"
if rc > 0 then say 'Dataset not found, RC='rc

Read a dataset line by line#

/* REXX - Read and process a sequential dataset */
address TSO "ALLOC F(INFILE) DA('MY.INPUT.FILE') SHR REUSE"

do while lines('//DD:INFILE') > 0
  line = linein('//DD:INFILE')
  if left(line,1) = '*' then iterate   /* skip comments */
  say 'Processing:' line
end

address TSO "FREE F(INFILE)"

Write a dataset#

address TSO "ALLOC F(OUTFILE) DA('MY.OUTPUT') SHR REUSE"

call lineout '//DD:OUTFILE', 'Header line'
call lineout '//DD:OUTFILE', 'Data line 1'
call lineout '//DD:OUTFILE', 'Data line 2'
call lineout '//DD:OUTFILE'           /* flush/close */

address TSO "FREE F(OUTFILE)"

Call ISPF services#

address ISPEXEC

/* Display a panel */
"DISPLAY PANEL(MYPANEL)"

/* Set/get dialog variables */
"VPUT (VAR1 VAR2) SHARED"
"VGET (VAR1 VAR2) SHARED"

/* Edit a dataset */
"EDIT DATASET('MY.SOURCE.LIB(MYMEMBER)')"

/* Browse */
"BROWSE DATASET('MY.OUTPUT.FILE')"