Appendice L. Conversione dei file batch di DOS in script di shell

Un certo numero di programmatori ha imparato lo scripting su PC dove era installato il sistema operativo DOS. Anche il frammentario linguaggio dei file batch di DOS consente di scrivere delle applicazioni e degli script piuttosto potenti, anche se questo richiede un ampio impiego di espedienti e stratagemmi. Talvolta, la necessità spinge a convertire vecchi file batch di DOS in script di shell UNIX. Questa operazione, generalmente, non è difficile, dal momento che gli operatori dei file batch DOS sono in numero inferiore rispetto agli analoghi operatori dello scripting di shell.

Tabella L-1. Parole chiave / variabili / operatori dei file batch e loro equivalenti di shell

Operatore di File BatchCorrispondente di scripting di shellSignificato
%$prefisso dei parametri da riga di comando
/-prefisso per le opzione di un comando
\/separatore di percorso
===(uguale a) verifica di confronto di stringhe
!==!!=(non uguale a) verifica di confronto di stringhe
||pipe
@set +vnon visualizza il comando corrente
**"carattere jolly" per nomi di file
>>redirezione di file (sovrascrittura)
>>>>redirezione di file (accodamento)
<<redirezione dello stdin
%VAR%$VARvariabile d'ambiente
REM#commento
NOT!nega la verifica successiva
NUL/dev/null"buco nero" dove seppellire l'output dei comandi
ECHOechovisualizzazione (molte più opzioni in Bash)
ECHO.echovisualizza una riga vuota
ECHO OFFset +vnon visualizza il/i comando/i successivo/i
FOR %%VAR IN (LISTA) DOfor var in [lista]; dociclo "for"
:ETICHETTAnessuno (non necessario)etichetta
GOTOnessuno (usa una funzione)salta ad un altra parte dello script
PAUSEsleeppausa o intervallo di attesa
CHOICEcase o selectmenu di scelta
IFifcondizione if
IF EXIST NOMEFILEif [ -e nomefile ]verifica l'esistenza del file
IF !%N==!if [ -z "$N" ]verifica se il parametro "N" non è presente
CALLsource o . (operatore punto)"include" un altro script
COMMAND /Csource o . (operatore punto)"include" un altro script (uguale a CALL)
SETexportimposta una variabile d'ambiente
SHIFTshiftscorrimento a sinistra dell'elenco degli argomenti da riga di comando
SGN-lt o -gtsegno (di intero)
ERRORLEVEL$?exit status
CONstdin"console" (stdin)
PRN/dev/lp0dispositivo di stampa (generico)
LPT1/dev/lp0primo dispositivo di stampa
COM1/dev/ttyS0prima porta seriale

Ovviamente, i file batch contengono, di solito, comandi DOS. Per una corretta conversione, anche questi devono essere sostituiti con i loro equivalenti UNIX.

Tabella L-2. Comandi DOS e loro equivalenti UNIX

Comando DOSCorrispettivo UNIXEffetto
ASSIGNlncollega file o directory
ATTRIBchmodcambia i permessi del file
CDcdcambia directory
CHDIRcdcambia directory
CLSclearpulisce lo schermo
COMPdiff, comm, cmpconfronta i file
COPYcpcopia i file
Ctl-CCtl-Cinterruzione (segnale)
Ctl-ZCtl-DEOF (end-of-file)
DELrmcancella il/i file
DELTREErm -rfcancella ricorsivamente una directory
DIRls -lelenca una directory
ERASErmcancella il/i file
EXITexitesce dal processo corrente
FCcomm, cmpconfronta i file
FINDgrepricerca le stringhe nei file
MDmkdircrea una directory
MKDIRmkdircrea una directory
MOREmorefiltro per l'impaginazione del testo del file
MOVEmvspostamento
PATH$PATHpercorso degli eseguibili
RENmvrinomina (sposta)
RENAMEmvrinomina (sposta)
RDrmdircancella una directory
RMDIRrmdircancella una directory
SORTsortordina il file
TIMEdatevisualizza l'ora di sistema
TYPEcatvisualizza il file allo stdout
XCOPYcpcopia (estesa) di file

Nota

In pratica, tutti gli operatori e i comandi di shell, e UNIX, possiedono molte più opzioni e funzionalità rispetto ai loro equivalenti DOS e dei file batch. Inoltre, molti file batch di DOS si basano su utility ausiliarie, come ask.com, una farraginosa controparte di read.

DOS supporta una serie molto limitata e incompatibile di caratteri jolly per l'espansione dei nomi dei file, riconoscendo solo i caratteri * e ?.

Convertire un file batch di DOS in uno script di shell è, solitamente, semplice ed il risultato, molte volte, è più leggibile dell'originale.

Esempio L-1. VIEWDATA.BAT: file batch DOS

REM VIEWDATA

REM ISPIRATO DA UN ESEMPIO PRESENTE IN "DOS POWERTOOLS"
REM                                    DI PAUL SOMERSON


@ECHO OFF

IF !%1==! GOTO VIEWDATA
REM  SE NON CI SONO ARGOMENTI DA RIGA DI COMANDO...
FIND "%1" C:\BOZO\BOOKLIST.TXT
GOTO EXIT0
REM  VISUALIZZA LA RIGA DELLA STRINGA VERIFICATA, QUINDI ESCE.

:VIEWDATA
TYPE C:\BOZO\BOOKLIST.TXT | MORE
REM  VISUALIZZA L'INTERO FILE, 1 PAGINA ALLA VOLTA.

:EXIT0

La conversione dello script rappresenta un miglioramento.

Esempio L-2. viewdata.sh: Script di shell risultante dalla conversione di VIEWDATA.BAT

#!/bin/bash
# viewdata.sh
# Conversione di VIEWDATA.BAT in script di shell.

FILEDATI=/home/bozo/datafiles/book-collection.data
NRARG=1

# @ECHO OFF                 In questo caso il comando è inutile.

if [ $# -lt "$NRARG" ]    # IF !%1==! GOTO VIEWDATA
then
  less $FILEDATI          # TYPE C:\MYDIR\BOOKLIST.TXT | MORE
else
  grep "$1" $FILEDATI     # FIND "%1" C:\MYDIR\BOOKLIST.TXT
fi  

exit 0                    # :EXIT0

#  Non sono necessari GOTO, etichette, giochi di specchi e imbrogli.
#  Il risultato della conversione è uno script breve, dolce e pulito,
#+ il che non può dirsi dell'originale.

In Shell Scripts on the PC, sul sito di Ted Davis, è presente un'ampia serie di manuali sull'arte, ormai fuori moda, della programmazione di file batch. È immaginabile che alcune delle sue ingegnose tecniche possano aver rilevanza anche per gli script di shell.