Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Avanti |
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 Batch | Corrispondente di scripting di shell | Significato |
---|---|---|
% | $ | 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 +v | non visualizza il comando corrente |
* | * | "carattere jolly" per nomi di file |
> | > | redirezione di file (sovrascrittura) |
>> | >> | redirezione di file (accodamento) |
< | < | redirezione dello stdin |
%VAR% | $VAR | variabile d'ambiente |
REM | # | commento |
NOT | ! | nega la verifica successiva |
NUL | /dev/null | "buco nero" dove seppellire l'output dei comandi |
ECHO | echo | visualizzazione (molte più opzioni in Bash) |
ECHO. | echo | visualizza una riga vuota |
ECHO OFF | set +v | non visualizza il/i comando/i successivo/i |
FOR %%VAR IN (LISTA) DO | for var in [lista]; do | ciclo "for" |
:ETICHETTA | nessuno (non necessario) | etichetta |
GOTO | nessuno (usa una funzione) | salta ad un altra parte dello script |
PAUSE | sleep | pausa o intervallo di attesa |
CHOICE | case o select | menu di scelta |
IF | if | condizione if |
IF EXIST
NOMEFILE | if [ -e nomefile ] | verifica l'esistenza del file |
IF !%N==! | if [ -z "$N" ] | verifica se il parametro "N" non è presente |
CALL | source o . (operatore punto) | "include" un altro script |
COMMAND /C | source o . (operatore punto) | "include" un altro script (uguale a CALL) |
SET | export | imposta una variabile d'ambiente |
SHIFT | shift | scorrimento a sinistra dell'elenco degli argomenti da riga di comando |
SGN | -lt o -gt | segno (di intero) |
ERRORLEVEL | $? | exit status |
CON | stdin | "console" (stdin) |
PRN | /dev/lp0 | dispositivo di stampa (generico) |
LPT1 | /dev/lp0 | primo dispositivo di stampa |
COM1 | /dev/ttyS0 | prima 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 DOS | Corrispettivo UNIX | Effetto |
---|---|---|
ASSIGN | ln | collega file o directory |
ATTRIB | chmod | cambia i permessi del file |
CD | cd | cambia directory |
CHDIR | cd | cambia directory |
CLS | clear | pulisce lo schermo |
COMP | diff, comm, cmp | confronta i file |
COPY | cp | copia i file |
Ctl-C | Ctl-C | interruzione (segnale) |
Ctl-Z | Ctl-D | EOF (end-of-file) |
DEL | rm | cancella il/i file |
DELTREE | rm -rf | cancella ricorsivamente una directory |
DIR | ls -l | elenca una directory |
ERASE | rm | cancella il/i file |
EXIT | exit | esce dal processo corrente |
FC | comm, cmp | confronta i file |
FIND | grep | ricerca le stringhe nei file |
MD | mkdir | crea una directory |
MKDIR | mkdir | crea una directory |
MORE | more | filtro per l'impaginazione del testo del file |
MOVE | mv | spostamento |
PATH | $PATH | percorso degli eseguibili |
REN | mv | rinomina (sposta) |
RENAME | mv | rinomina (sposta) |
RD | rmdir | cancella una directory |
RMDIR | rmdir | cancella una directory |
SORT | sort | ordina il file |
TIME | date | visualizza l'ora di sistema |
TYPE | cat | visualizza il file allo stdout |
XCOPY | cp | copia (estesa) di file |
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.