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. 2. Premier programme
#!/bin/ksh 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"...echo "Hello World!" 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
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 :
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 :
#!/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";
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 |