M. Convertir des fichiers batch DOS en scripts shell

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 M.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 généralement des commandes DOS. Pour convertir un fichier batch en script shell, il faut les remplacer par leurs équivalent UNIX.

Tableau M.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)

[Note]

Note

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 M.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. [149]

Exemple M.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.



[149] Plusieurs lecteurs ont suggéré des modifications sur le fichier batch ci-dessus pour le rendre plus beau et pour qu'il soit plus compact et efficace. L'auteur du Guide ABS pense que cet effort est inutile. Un script Bash peut accéder à un système de fichiers DOS ou même une partition NTFS (avec l'aide de ntfs-3g) pour réaliser des opérations en groupe ou scriptées.