De nombreux programmeurs ont appris la programmation de scripts sur un PC avec DOS. Même le langage limité de fichiers batch sous DOS a permis l'écriture de scripts et d'applications assez puissantes, bien que cela nécessitait souvent des astuces assez importantes. Occasionnellement, le besoin de convertir un ancien fichier batch DOS en script shell UNIX se fait encore sentir. Ce n'est généralement pas difficile car les opérateurs d'un fichier batch DOS ne sont qu'un sous-ensemble limité des équivalents en shell.
Tableau L.1. Mots clés / variables / opérateurs des fichiers batch, et leur équivalent shell
Opérateur de fichier batch | Équivalent en script shell | Signification |
---|---|---|
% | $ | préfixe d'un paramètre en ligne de commande |
/ | - | préfixe d'option d'une commande |
\ | / | séparateur d'un chemin de répertoire |
== | = | (égal-à) test de comparaison de chaînes de caractères |
!==! | != | (non égal-à) test de comparaison de chaînes de caractères |
| | | | tube |
@ | set +v | n'affiche pas la commande actuelle |
* | * | « joker » dans un nom de fichier |
> | > | redirection de fichier (écrasement) |
>> | >> | redirection de fichier (ajout) |
< | < | redirection de stdin |
%VAR% | $VAR | variable d'environnement |
REM | # | commentaire |
NOT | ! | négation du test suivant |
NUL | /dev/null | « trou noir » pour supprimer la sortie des commandes |
ECHO | echo | echo (bien plus d'options avec Bash) |
ECHO. | echo | affiche une ligne vide |
ECHO OFF | set +v | n'affiche pas la commande suivante |
FOR %%VAR IN (LIST) DO | for var in [liste]; do | boucle « for » |
:LABEL | none (inutile) | label |
GOTO | none (utiliser une fonction) | saute à un autre emplacement du script |
PAUSE | sleep | pause ou attente pendant un intervalle de temps |
CHOICE | case ou select | choix ou menu |
IF | if | test if |
IF EXIST NOMFICHIER | if [ -e nomfichier ] | teste si le fichier existe |
IF !%N==! | if [ -z "$N" ] | si le paramètre « N » n'est pas présent |
CALL | source ou . (opérateur point) | « inclut » un autre script |
COMMAND /C | source ou . (opérateur point) | « inclut » un autre script (identique à CALL) |
SET | export | affecte une valeur à une variable d'environnement |
SHIFT | shift | décalage gauche de la liste des arguments en ligne de commande |
SGN | -lt ou -gt | signe (d'un entier) |
ERRORLEVEL | $? | code de sortie |
CON | stdin | « console » (stdin) |
PRN | /dev/lp0 | périphérique imprimante (générique) |
LPT1 | /dev/lp0 | premier périphérique imprimante |
COM1 | /dev/ttyS0 | premier port série |
Les fichiers batch contiennent habituellement des commandes DOS. Elles doivent être remplacées par leur équivalent UNIX pour convertir un fichier batch en script shell.
Tableau L.2. Commandes DOS et leur équivalent UNIX
Commande DOS | Équivalent UNIX | Effet |
---|---|---|
ASSIGN | ln | lie un fichier ou un répertoire |
ATTRIB | chmod | change les droits d'un fichier |
CD | cd | change de répertoire |
CHDIR | cd | change de répertoire |
CLS | clear | efface l'écran |
COMP | diff, comm, cmp | compare des fichiers |
COPY | cp | copie des fichiers |
Ctl-C | Ctl-C | break (signal) |
Ctl-Z | Ctl-D | EOF (end-of-file, fin de fichier) |
DEL | rm | supprime le(s) fichier(s) |
DELTREE | rm -rf | supprime le répertoire récursivement |
DIR | ls -l | affiche le contenu du répertoire |
ERASE | rm | supprime le(s) fichier(s) |
EXIT | exit | sort du processus courant |
FC | comm, cmp | compare des fichiers |
FIND | grep | cherche des chaînes de caractères dans des fichiers |
MD | mkdir | crée un répertoire |
MKDIR | mkdir | crée un répertoire |
MORE | more | affiche un fichier page par page |
MOVE | mv | déplace le(s) fichier(s) |
PATH | $PATH | chemin vers les exécutables |
REN | mv | renomme (ou déplace) |
RENAME | mv | renomme (ou déplace) |
RD | rmdir | supprime un répertoire |
RMDIR | rmdir | supprime un répertoire |
SORT | sort | trie un fichier |
TIME | date | affiche l'heure système |
TYPE | cat | envoie le fichier vers stdout |
XCOPY | cp | copie de fichier (étendue) |
Virtuellement, tous les opérateurs et commandes shell et UNIX ont beaucoup plus d'options et de fonctionnalités que leur équivalent DOS et fichier batch. Beaucoup de fichiers batch DOS reposent sur des utilitaires supplémentaires, tel que ask.com, un équivalent limité de read.
DOS supporte un sous-ensemble très limité et incompatible de caractères d'expansion pour les noms de fichier, reconnaissant seulement les caractères * et ?.
Convertir un fichier batch DOS en script shell est généralement assez simple et le résultat est souvent bien meilleur que l'original.
Exemple L.1. VIEWDATA.BAT : Fichier Batch DOS
REM VIEWDATA REM INSPIRED BY AN EXAMPLE IN "DOS POWERTOOLS" REM BY PAUL SOMERSON @ECHO OFF IF !%1==! GOTO VIEWDATA REM IF NO COMMAND-LINE ARG... FIND "%1" C:\BOZO\BOOKLIST.TXT GOTO EXIT0 REM PRINT LINE WITH STRING MATCH, THEN EXIT. :VIEWDATA TYPE C:\BOZO\BOOKLIST.TXT | MORE REM SHOW ENTIRE FILE, 1 PAGE AT A TIME. :EXIT0
La conversion de ce script en est une belle amélioration.
Exemple L.2. viewdata.sh : Conversion du script shell VIEWDATA.BAT
#!/bin/bash # viewdata.sh # Conversion de VISUDONNEES.BAT en script shell. FICHIERDONNEES=/home/bozo/datafiles/book-collection.data SANSARGUMENT=1 # @ECHO OFF Commande inutile ici. if [ $# -lt "$SANSARGUMENT" ] # IF !%1==! GOTO VIEWDATA then less $FICHIERDONNEES # TYPE C:\MYDIR\BOOKLIST.TXT | MORE else grep "$1" $FICHIERDONNEES # FIND "%1" C:\MYDIR\BOOKLIST.TXT fi exit 0 # :EXIT0 # Les GOTOs, labels, smoke-and-mirrors et flimflam sont inutiles. # Le script converti est court, joli et propre, ce qu'on ne peut pas dire de #+ l'original.
Le site Shell Scripts on the PC de Ted Davis contient un ensemble complet de tutoriels sur l'art démodé de la programmation des fichiers batch. Certaines de ses techniques ingénieuses peuvent raisonnablement être utilisées dans des scripts shell.