Chiamare da un CL IBMi uno script SH e ricevere un output da esso

CLP (Control Language Program) è un linguaggio di scripting eccezionalmente potente che permette di automatizzare operazioni su IBM-i (conosciuto anche come AS400).

Seppur potente, non copre proprio tutto tutto, e spesso va affiancato ad altri strumenti quali script SH *nix-like, che permette a chi viene da sistemi Linux o Unix di poter creare cose molto interessanti.

Qui di seguito un esempio di programma che intercetta l’output di uno script SH che può essere utilizzato come variabile all’interno di un programma CLP:

PREMESSA: sulla macchina deve essere presente 5770-SS1 – Portable Application Solutions Environment.

Per intercettare il STDOUT va creata una variabile di sistema tramite il comando:

ADDENVVAR ENVVAR(QIBM_QSH_CMD_OUTPUT)  VALUE(STDOUT) LEVEL(*JOB)

Esempio di programma:

PGM                                               
DCLF       FILE(QTEMP/O1)                         
DLTF       FILE(QTEMP/O1)                         
MONMSG     MSGID(CPF2105)                         
CRTPF      FILE(QTEMP/O1) RCDLEN(1000)            
OVRDBF     FILE(STDOUT) TOFILE(QTEMP/O1)          
STRQSH     CMD('SH path dello script')
DLTOVR     FILE(*ALL)                             
RCVF                                              
MONMSG     MSGID(CPF0864)                         
SNDPGMMSG  MSG(&O1)  
ENDPGM                                            

Questo esempio:
– scrive sul file QTEMP/O1 tramite OVRDBF l’output dello script SH
– tramite RCVF del file QTEMP/O1 può essere letto il campo appena scritto come variabile &O1

Letteratura a supporto

https://www.ibm.com/docs/en/i/7.2?topic=reference-calling-qshell-commands-from-i-command-line

https://www.ibm.com/docs/en/i/7.3?topic=i-installing-pase

Risultato di una Query DB2 in uno script QSH su AS400

Spero che questo sia solo il primo di un lunghissimo elenco di tips ed articoli tecnici su questo sito.

Se volessimo usare il risultato di una qualsiasi query in una variabile di uno script SH?

Esempio: in una tabella DB2 ho un elenco di parametri definiti per utente:

Tabella SEDECENTRALE.UFFICIO

|Utente |Ufficio | Mailbox
—————————————————
|andrea |01 | andrea@ufficio.com
|marco |02 | marco@ufficio.com

i record nella colonna “Utente” corrispondono agli username della macchina.
L’utente “andrea” se lanciasse da QSH lo script qui sotto riportato, riceverebbe come output la mailbox contenuta nella tabella sopra riportata:

!/usr/bin/qsh
VAR=$(db2 “select Mailbox from SEDECENTRALE.UFFICIO where Utente = $LOGNAME ‘”|sed -e ‘1,3d’|tail -r|tail +4|tail -r| xargs |cut -d ‘;’ -f 1)
echo $VAR

NOTA BENE: QSHELL è Posix Compliant e molti dei comandi e delle variabili d’ambiente sono ereditate da UNIX. $LOGNAME è una variabile d’ambiente che restituisce l’utenza connessa al sistema.