Shell Unix




  1. Qu'est ce qu'un shell

Un shell est un environnement d'execution de programme. Dans le cadre d'Unix, il existe plusieurs types de shell : Bourne Shell, C Shell, Korn Shell... et bien d'autres. Chacun de ces environnement dispose de commandes spécifiques, et l'execution des programmes, ainsi que leur écriture en est donc impactée.

Le principe est par contre toujours le même : c'est un langage itératif. Donc, les commandes sont executées une à une. Par conséquent, si le programme a une erreur de syntaxe, il est quand même executé, jusqu'à l'erreur. Ainsi, on peut facilement déceler les problèmes... Les résoudre c'est bien sûr autre chose !

De plus, les commandes peuvent aussi bien être enregistrées dans un fichier que taper en directe. Ce qui veut simplement dire que vous pouvez directement faire les commandes Unix dont vous avez besoin. Donc, pour effacer un fichier, c'est "rm"...

Nous verrons, peut-être, plus tard les différences entre ces shells, mais pour l'instant, nous allons surtout voir le Korn Shell, ou "ksh", l'un des plus utilisés.

Attention, le Shell est TRES sensible à la syntaxe : il suffit d'un espace mal mit, et ca ne marche pas...



  2. Premier programme

#!/bin/ksh

echo "Hello World!"
La première ligne est une ligne générique. Elle permet de définir le shell utilisé. En l'occurrence, nous allons utilisé le Korn Shell. Si vous souhaitez plutot utiliser du C Shell, vous devez mettre "csh"...

Ensuite, la commande "echo" permet d'afficher quelque chose à l'écran. En l'occurance, on affiche la phrase "Hello World!", qui est utilisée très très très fréquemment pour faire son premier programme.



  3. Variables



  3. 1. Variables Standards

NomDescription
$0Nom du script
$#Nombre de paramètre envoyés au script
$?Code de la dernière commande
$@Liste de tous les paramètres
$1...$nValeur correspondant au 1..nième paramètre


  3. 2. Variables d'Environnement

On peut facilement accéde aux variables d'environnement, l'un des intérêts majeurs des batchs.

Par exemple, pour afficher le PATH, il suffit de faire ceci :
echo $PATH



  3. 3. Variables Utilisateur

Evidemment, l'utilisateur peut également fixer ses propres variables !

Voici un exemple de code qui vous montre comment fonctionne l'utilisation de variables que l'utilisateur a déclarée :
VARIABLE_UTILISATEUR="C'est juste un test"
echo $VARIABLE_UTILISATEUR



  3. 4. Opérations sur les variables

VAR1=2
VAR2=5
(( VAR1 = VAR + 1 ))
(( VAR3 = VAR1 + VAR2 ))
(( VAR4 = VAR1 - VAR2 ))
(( VAR5 = VAR1 * VAR2 ))
(( VAR6 = VAR1 / VAR2 ))
(( VAR7 = VAR1 / VAR2 ))
(( VAR8 = VAR1 % VAR2 )) # (modulo)

echo $VAR1
VAR3 = VAR1 + VAR2



  4. Bouts de code utiles



  4. 1. Verifier s'il y a des paramètres

On peut avoir besoin de vérifier si l'utilisateur a passé des paramètres à la ligne de commande. Pour ce faire, voici un bout de code qui marche :
if [ $# = 0 ]; then
    echo "Aucun paramètre"
else
    echo "Des paramètres"
fi



  4. 2. Utiliser le premier paramètre avec un case

Le "case" est très utile, il permet en autre d'éviter les "if" imbriqués. Voici donc un exemple d'utilisation du "case" :
case "$1" in
    a) echo "Bonjour";;
    b) echo "Bonsoir";;
    *) echo "Salut";;
esac



  4. 3. Comparer 2 valeurs



  4.3.1. Comparer 2 nombres

Voici la liste des opérateurs numériques :
  • -eq : égalité
  • -ne : different
  • -gt : supérieur à
  • -lt : inférieur à
  • -ge : supérieur ou égal à
  • -le : inférieur ou égal à
VAR1 = 2
VAR2 = 5
if [ $VAR1 -ne $VAR2 ]; then
    echo "Nombre different"
else
    echo "Nombre identique"
fi



  4.3.2. Comparer 2 chaines de caractères

Voici un exemple de code complet pour comparer 2 chaines de caractères :
  • = : égalité
  • != : different

#!/bin/ksh

VAR1="premier"
VAR2="second"

if [ "$VAR1" != "$VAR2" ]; then
    echo "chaine differente"
else
    echo "chaine identique"
fi



  4. 4. Tester l'existence des fichiers

monFichier="/tmp/fichTemp"
if [ -f $monFichier ]; then
    echo $monFichier" existe"
else
    echo $monFichier" n'existe pas"
fi



  4. 5. Faire une opération sur une liste de fichier

REPERTOIRE="/usr"
for file in "*.sh"
do
    wc -l $file
done


  4. 6. Faire une opération sur une arborescence de fichier

REPERTOIRE="/usr"
find $REPERTOIRE -type f -name "*" |
{
while read FICHIER
do
    ls -Fla $FICHIER
done
}


  4. 7. Opérations sur le contenu d'un fichier



  4.7.1. Additionner les lignes d'un fichier

Le fichier est constitué d'une valeur numérique par ligne :
#!/bin/ksh

SOM=0;
exec 3</monrep/fich.src
while read -u3 LIGNE
do
  (( SOM = SOM + LIGNE ))
done
print "La somme des lignes est : $SOM\n";
  • la ligne "exec 3..." signifie que le fichier /monrep/fich.src est lu et renvoyé vers le descripteur "3" (en choisir un supérieur à 2)
  • la ligne "while read -u3" lit chaque ligne renvoyé dans le 3ème descripteur et l'envoi dans la variable LIGNE jusqu'a la fin du fichier



  4.7.2. Afficher les informations sur des lignes tirées d'un fichier

Par exemple, vous avez un fichier qui contient les noms (et chemins d'accès) vers plusieurs fichiers, et vous voulez récupérer la date, les droits... en gros, l'équivalent du "ls -l" pour chacun de ces fichiers.
#!/bin/ksh

for f in `cat /tmp/monfich`
do
  ls -l $f
done



Page modifiée le : 06/08/2003
Site modifié le : 14/09/2020


Valid XHTML 1.0 Transitional