![]() |
Corso di programmazione in REXX - Lezione 4 - nozioni di base![]() |
Nota: i sorgenti descritti in questo numero sono stati raccolti nel file rxsource.zip (12.388 byte).
I comandi
L'ambiente La regola di base è che qualsiasi cosa il REXX non può elaborare viene valutata e quindi passata all'ambiente di default. Il concetto di ambiente diventa importante quando si usa il REXX per passare dei comandi ad altri programmi.
Dal REXX all'interprete dei comandi
Lo script REXX viene esaminato una riga per volta per determinare se ogni espressione sia:
Se l'espressione non ricade in alcuna delle suddescritte categorie, il REXX valuta l'intera riga come un'espressione, passandone la stringa risultante alla shell dei comandi. Se la stringa è un comando valido (per esempio DIR o COPY) allora l'interprete dei comandi del sistema operativo lo processa come se fosse stato introdotto da tastiera. Esempi: /* DIRREX.CMD: mostra la directory corrente */ say "comando DIR tramite REXX" DIR Non essendo la parola DIR nè un'istruzione REXX nè un'etichetta, il REXX la valuta e la passa all'interprete dei comandi di OS/2, il quale, riconoscendo DIR come uno dei suoi comandi lo esegue come se fosse stato introdotto da tastiera. Il passaggio del comando all'interprete dei comandi comporta la riscrittura sullo schermo del comando stesso (echoing). Per eliminare questa noiosa ripetizione si può far precedere ciascun comando dal carattere @ o inserire all'inizio dello script il comando: "@ECHO OFF"
Esecuzione di uno script REXX esterno Ci sono due tipi di CALL che è possibile usare:
L'istruzione CALL del REXX richiama uno script REXX esterno: CALL MYSCRIPTesegue il programma REXX MYSCRIPT.CMD. L'istruzione CALL non è in grado di richiamare un file .CMD che non sia uno script REXX (cioè un semplice file BATCH). Per quest'ultimo è necessario usare CALL come comando dell'interprete dei comandi: "CALL MYSCRIPT"La presenza delle virgolette fa sì che la riga "CALL MYSCRIPT" venga valutata dall'interprete del REXX e che il risultato CALL MYSCRIPT venga passato all'interprete dei comandi di OS/2. Le virgolette che racchiudono il comando permettono di distinguerlo dall'omonima istruzione REXX.
Uso di variabili /* SHOWFILE.CMD */ /* chiede all'utente di introdurre il nome di un file */ say "Introduci il nome di un file:" /* assegna la rsiposta alla variabile FILENAME */ pull filename /* costruisce il comando tramite concatenazione */ commandstr = "@TYPE" filename /* se l'utente ha introdotto, per esempio, "AUTOEXEC.BAT" */ /* la variabile COMMANDSTR conterrà: "@TYPE AUTOEXEC.BAT" */ commandstr /* il REXX passa il comando al sistema */Quando lo script viene eseguito si avrà: [C:\]SHOWFILE Introduci il nome di un file: AUTOEXEC.BAT @ECHO OFF ECHO. PROMPT $i$p$g REM SET DELDIR=C:\DELETE,512; SET WIN3DIR=C:\OS2\MDOS\WINOS2 PATH=C:\OS2;C:\OS2\MDOS;C:\;C:\OS2\MDOS\WINOS2; LOADHIGH APPEND C:\OS2;C:\OS2\SYSTEM SET TMP=C:\ REM LOADHIGH DOSKEY FINDFILE=DIR /A /S /B $* REM DOSKEY EDIT=QBASIC/EDITOR $* REM SET DIRCMD=/A SET TEMP=C:\OS2\MDOS\WINOS2\TEMP [C:\]
Uso delle virgolette /* DIRREX2.CMD */ /* assegna un valore al simbolo DIR */ say "comando DIR tramite REXX" dir = "echo Questa non è una directory!" /* passa al sistema l'espressione DIR */ dirIn questo esempio dir è una variabile che contiene la stringa "echo Questa non è una directory!". Quando il programma viene eseguito sullo schermo si otterrà: [C:\]dirrex comando DIR tramite REXX Questa non è una directory! [C:\]Il REXX valuta una stringa racchiusa tra virgolette esattamente come è. Per assicurarsi che un simbolo di un comando non sia valutato come variabile è necessario racchiuderlo tra virgolette, come si può vedere nel seguente esempio: /* DIRREX3.CMD" */ /* assegna un valore al simbolo DIR */ say "comando DIR tramite REXX" dir = "echo Questa non è una directory!" /* passa al sistema la stringa letterale DIR */ "dir"Eseguendo lo script, questa volta, otterremo l'elenco dei file contenuti nella directory corrente.
L'uso delle virgolette è essenziale anche quando il comando che si vuole
passare al sistema include un operatore REXX. DEL "*.TMP" DIR "/W"oppure "DEL *.TMP" "DIR /W"Se è necessario usare una variabile nella stringa del comando, questa deve essere lasciata fuori dalla virgolette: extension = "BAK" option = "/W" "DEL *." || extension "DIR" || optionaltre forme valide di concatenazione sono: "DEL *."extension /* senza spazi tra le virgolette e la variabile */ "DIR "option
L'istruzione ADDRESS ADDRESS environment expressiondove:
address CMD "dir" /* passa il comando DIR a CMD.EXE */ cmdstr = "dir *.txt" address CMD cmdstr /* passa la stringa "dir *.txt" a CMD.EXE */Quando si usa l'istruzione ADDRESS il REXX dapprima valuta il valore dell'espressione e poi lo passa al programma CMD. Anche per la stringa che si vuole passare all'ambiente tramite ADDRESS valgono le stesse considerazioni menzionati per i comandi passati al sistema: usare sempre le virgolette se ci sono ambiguità con variabili, istruzioni o con operatori REXX! Attraverso l'istruzione ADDRESS lo stesso script REXX può indirizzare dei comandi a due o più ambienti diversi. Questo può essere usato nel caso che si voglia impiegare il REXX come linguaggio di macro.
Dall'interprete dei comandi al REXX Con l'esecuzione di ogni comando l'interprete dei comandi genera un codice di ritorno che quando il comando viene eseguito tramite il REXX viene assegnato automaticamente ad una speciale variabile REXX chiamata RC. Quando un comando viene eseguito senza problemi, di solito, il valore restituito è 0, mentre se qualcosa va storto viene restituito un valore diverso da zero, che dipende dal comando stesso e dal tipo di problema verificatosi.
Lettura dei codici di ritorno /* GETRC.CMD: prova a scrivere sullo schermo un file */ /* che non esiste tramite il comando type riportando */ /* il valore di ritorno del comando */ "@TYPE nosuch.fil" say "il valore di ritorno è" RCIl valore di ritorno è utile per comunicare all'utente il tipo di problema che si è verificato ed, eventualmente, per intraprendere un'azione alternativa: /* REPORTRC.CMD: prova a scrivere un file sullo schermo */ /* tramite il comando type, se questo fallisce chiede */ /* all'utente di inserire un nuovo nome di file */ "@TYPE nosuch.fil" if RC \= 0 /* se il valore di ritorno è diverso da zero */ then do say "impossibile trovare nosuch.fil! Introduci il nome di un nuovo file:" pull filename "@TYPE" filename end /* do */In una lezione successiva approfondiremo l'uso delle istruzioni che, come IF...THEN...ELSE, ci permettono di controllare lo svolgimento del programma in base al vereficarsi di date condizioni.
Il programma REXXTRY Ecco alcuni esempi del funzionamento di REXXTRY: REXXTRY say 1 + 2 /* mostra 3 */ REXXTRY say 2 + 3; say 3 + 4 /* mostr 5 e 7 */ /* mostra "la media è 2.5" */ REXXTRY somma=1+2+3+4; say "la media è" somma/4Quando si esegue REXXTRY dalla riga di comando seguito da alcune istruzioni REXX, l'interprete dei comandi di OS/2 elabora la riga di comando nel modo usuale. Nel seguente esempio: REXXTRY say AB > CDl'argomento di REXXTRY non è say AB > CD, ma l'interprete dei comandi considererà il simbolo > come operatore di redirezione dell'uscita, per cui REXXTRY verrà eseguito con say AB come argomento e la stringa AB verrà scritta nel file CD.
Quando REXXTRY viene eseguito senza argomenti, le istruzioni REXX possono
essere introdotte ininterrottamente dalla riga di comando finché, per
terminare, non si introduce l'struzione EXIT o RETURN. [C:\]rexxtry REXXTRY.CMD lets you interactively try REXX statements. Each string is executed when you hit Enter. Enter 'call tell' for a description of the features. Go on - try a few... Enter 'exit' to end. say AB > CD 0 ................................................ REXXTRY.CMD on OS/2 somma = 1 + 2 + 3 + 4 ................................................ REXXTRY.CMD on OS/2 say "la media è" somma / 4 la media è 2.5 ................................................ REXXTRY.CMD on OS/2 exit [C:\]Tra i sorgenti inclusi in questo numero c'è una versione migliorata del programma REXXTRY (EREXXTRY.CMD) grazie alle routine di input scritte da Bernd Schemmer pubblicate nel suo ottimo REXX tips and tricks reperibile su internet come rxtt27.zip.
|