6. Un peu de programmation

Contenu de cette section

6.1 Les scripts shell : des fichiers .BAT dopés aux stéroides

Si vous utilisiez les fichiers .BAT pour créer des raccourcis pour de longues lignes de commande (c'est ce que je faisais beaucoup moi-même), ce but peut être atteint en insérant des lignes alias appropriées (cf. les exemples ci-dessus) dans profile ou .profile. Mais si vos .BAT étaient plus compliqués, alors vous aimerez le langage de script que vous offre le shell : il est aussi puissant que le QBasic, sinon plus. Il a des variables, des structures comme while, for, case, if... then... else, et un tas d'autres caractéristiques : il peut constituer une bonne alternative à un ``vrai'' langage de programmation.

Pour écrire un script---l'équivalent d'un fichier .BAT sous DOS---tout ce que vous avez à faire est d'écrire un fichier ASCII standard contenant les instructions, de le sauver, et de le rendre exécutable avec la commande chmod +x <fichierscript>. Pour l'exécuter, tapez son nom.

Quelques mots de mise en garde. L'éditeur du système est appelé vi, et, d'après mon expérience, la plupart des nouveaux utilisateurs le trouve très difficile à utiliser. Je ne vais pas expliquer comment l'utiliser, parce que je ne l'aime pas et que je ne l'utilise pas, alors voilà. Lisez le ``Linux installation...'' de Math Welsh p. 109 (vous feriez mieux de mettre la main sur un autre éditeur comme joe ou emacs pour X.) Je me contenterai de dire que :

L'écriture de scripts sous bash est un sujet tellement vaste qu'il nécessiterait un livre à lui seul, et je ne creuserai pas le sujet plus en avant. Je vous donnerai juste un exemple de script shell, duquel vous pouvez extraire quelques règles de base :



#!/bin/sh
# echantillon.sh
# je suis un commentaire
# ne changez pas la premiee ligne, elle doit se trouver la
echo "Ce systeme est : `uname -a`" # utilise la sortie de la commande 'uname'
echo "Je m appelle $0" # variables predefinies
echo "Vous m avez donne les  $# parametres suivants : "$*
echo "Le premier parametre est : "$1
echo -n "Commnt vous appelez-vous? " ; read votre_nom
echo notez la difference : "salut $votre_nom" # delimitation par "
echo notez la difference : 'salut $votre_nom' # delimitation par '
DIRS=0 ; FILES=0
for file in `ls .` ; do
  if [ -d ${file} ] ; then # si le fichier est un repertoire
    DIRS=`expr $DIRS + 1`  # DIRS = DIRS + 1
  elif [ -f ${file} ] ; then
    FILES=`expr $FILES + 1`
  fi
  case ${file} in
    *.gif|*jpg) echo "${file} : fichier graphique" ;;
    *.txt|*.tex) echo "${file} : fichier texte" ;;
    *.c|*.f|*.for) echo "${file} : fichier source" ;;
    *) echo "${file} : fichier generique" ;;
  esac
done
echo "il y a  ${DIRS} repertoires et ${FILES} fichiers"
ls | grep "ZxY--!!!WKW"
if [ $? != 0 ] ; then # code de sortie de la derniere commande
  echo "ZxY--!!!WKW not found"
fi
echo "Ca suffit... tapez 'man bash' si vous voulez plus d infos."

6.2 E-C-iez par vous-même

Sous Unix, le langage système est le C, que vous l'aimiez ou le détestiez. Des tonnes d'autres langages (FORTRAN, Pascal, Lisp, Basic, Perl, awk...) sont àgalement disponibles.

En partant du principe que vous connaissez le C, voici quelques indications pour ceux d'entre vous qui ont été pourris-gâtés parle Turbo C++ ou l'un de ses frères du DOS. Le compilateur C de Linux est appellé gcc et n'a pas toutes les fioritures qui accopagnent généralement ses correspondants DOS : pas de IDE, d'aide en ligne, de debugger intégré etc... C'est just un compilateur brut en mode ligne de commande, très puissant et efficace. Pour compiler votre hello.c standard, vous ferez :

$ gcc hello.c

ce qui va créer un fichier exécutable appelé a.out. Pour donner un nom différent à l'exécutable, faites :

$ gcc -o hola hello.c

Pour linker un pogramme avec une bibliothèque; ajoutez l'option -l<nomdebiblio>. Par exemle, pour linker avec la bibliothèque mathématique :

$ gcc -o mathprog mathprog.c -lm

(L'option -l<nomdebiblio> oblige gcc à linker la bibliothèque /usr/lib/lib<nomdebiblio>.a; donc, -lm renvoie à /usr/lib/libm.a.)

Jusque là, tout va bien. Mais lorsque votre programme est composé de plusieurs fichiers source, vous aurez besoin de faire appel à l'utilaire make. Supposons que vous ayez écrit un analyseur d'expressions : son fichier source s'appelle parser.c et inclut ( #include ) deux fichiers d'en-têtes, parser.h et xy.h. Puis vous voulez utiliser les routines de parser.c dans un programme, disons, calc.c, qui inclut ( #include ) à son tour parser.h. Quel souk ! Comment devez vous faire pour compiler calc.c?

Vous aurez à écrire un fichier appelé makefile, qui apprend au compilateur les dépendances entre fichiers objet et fichiers source. Dans notre exemple :



# Voici le makefile, utilise pour compiler calc.c
# Pressez la touche <TAB> aux endroits indiques!

calc: calc.o parser.o
<TAB>gcc -o calc calc.o parser.o -lm
# calc depend de deux fichiers objet: calc.o et parser.o

calc.o: calc.c parser.h
<TAB>gcc -c calc.c
# calc.o depend de deux fichiers source

parser.o:  parser.c parser.h xy.h
<TAB>gcc -c parser.c
# parser.o depend de trois fichiers source

# fin du makefile.

Sauvez ce fichies sous le nom de makefile et tapez

$ make

pour compiler votre programme; une alternative est de le sauver comme calc.mak et de taper

$ make -f calc.mak

Et, bien sûr, LPM.

Vous pouvez invoquer un minimum d'aide à propos des fonctions C, qui sont traitées dans les pages man, section 3, par exemple,

$ man 3 printf

Il y a des tas de bibliothèques disponibles; parmi les premiers que vous voudrez utiliser il y a ncurses, qui s'occupe des effets du mode texte, et svgalib pour faire du graphique. Si vous vous sentez de taille à attaquer la programmation X, procurez-vous XForms ( bloch.phys.uwm.edu/pub/xforms ) et/ou MGUI ( www.volftp.vol.it/IT/IT/ITALIANI/MORELLO/index.htm ), deux bibliothèques géniales qui facilitent la programmation X. De plus, si vous ne pouvez vous passer d'un IDE à la Borland, procurez-vous le paquetage xwpe à partir de sunsite.unc.edu:/pub/Linux/apps/editors/ . Il y beaucoup de chances pour que vous l'aimiez.


Chapitre suivant, Chapitre Précédent

Table des matières de ce chapitre, Table des matières générale

Début du document, Début de ce chapitre