![]() |
guill.net
-
La page des réseaux
|
![]() ![]() |
De la compréhension des scripts
A partir des commandes shell, chaque utilisateur peut créer ses propres fichiers de commandes appelés scripts.
Variables et substitution
Les chaînes peuvent être délimitées par les trois caractères ', " et `. Ces délimiteurs se différencient par le type de substitions qui sont réalisées à l'intérieur des chaînes qu'ils délimitent.
Afficher le contenu des
variables réservées du shell suivantes (attention
aux majuscules...) :
Nom | Descriptif |
HOME | Nom du répertoire courant de l'utilisateur |
LOGNAME | Nom de connexion de l'utilisateur |
PATH | Liste des répertoires explorés par le système pour rechercher une commande |
PS1 | Prompt d'invitation à entrer une commande |
SHELL | Nom du shell utilisé |
TERM | Nom du terminal |
Redéfinissez votre prompt de la manière que vous souhaitez.
Premier script simple
Taper l'exemple suivant dans le fichier dddate:
Les paramètres des scripts
La variable de nom * (interrogeable
avec echo $* par exemple !) est interne au shell et a pour valeur la liste
des variables de position, c'est à dire des paramètres transmis
lors d'un appel à un fichier de commandes (ou script). Chacun de
ces paramètres peut être désigné par sa position
dans la liste : les valeurs de ces paramètres étant : $1,
$2, etc. De plus, $0 est le nom de la commande exécutée.
Enfin, le nombre de paramètres est donné par la valeur $#
de la variable #.
Taper le script com_bash1
suivant :
La structure de contrôle if/then/else
La structure de cette commande est la suivante:
A la limite, il vaut mieux trop de retours chariot que pas assez comme dans l'exemple suivant qui fonctionne bien:
Expression | Vraie si |
-a ref | ref existe |
-d ref | ref est un répertoire |
-f ref | ref est un fichier |
-s ref | ref existe et est de taille non nulle |
-n chaine | chaine est de longueur non nulle |
-z chaine | chaine est de longueur nulle |
num1 -eq num2 | égalité numérique (equal) |
num1 -ne num2 | inégalité numérique (non equal) |
num1 -gt num2 | supérieur numérique (greater than) |
num1 -ge num2 | supérieur ou égal numérique |
num1 -lt num2 | inférieur numérique |
num1 -le num2 | inférieur ou égal numérique |
chaine1 = chaine2 | égalité alphanumérique |
chaine1 != chaine2 | inégalité alphanuméerique |
chaine1 > chaine2 | supérieur alphanumérique |
chaine1 < chaine2 | inférieur alphanumérique |
La commande test évalue une expression et positionne un code de retour à 0 si la condition est vraie et à 1 si la condition est fausse.
Utiliser la commande test
afin d'écrire un script appelé
what. Ce script teste
si un nom est un répertoire ou non
Dans le cas où c'est
est un répertoire, le contenu de ce dernier devra être listé.
Si c'est un fichier, il faudra que le script indique la nature de ce fichier
(utiliser la commande file <nom du fichier>).
Remarque 1
Les structures de contrôle conditionnelles utilisent le code de retour de la dernière commande exécutée.
Remarque 2
La variable shell ? (accessible par $? donc !) contient le code de retour de la dernière commande exécutée.
Essayer l'exemple suivant:
La commande exit n
termine un script avec un code de retour égal à n (Si n n'est
pas précisé, le code de retour du script est celui de la
dernière commande exécutée).
Tester cette remarque à
l'aide d'un petit script que vous inventerez.
Solution
Remarque 4
La commande read lit une ligne sur l'entrée standard. Créer le script essai suivant:
Règle 1
Chaque commande possède par défaut:
L'entrée et les sorties standard d'une commande peuvent être redirigées vers un fichier spécial ou ordinaire.
Règle 3
Le symbole | (dénommé ``tube'' en français et ``pipe'' en anglais) permet de connecter la sortie standard d'une commande à l'entrée standard de la commande suivante. Exemple:
Compteurs
Tapez le script compt suivant :
Calculs mathématiques
Que fait la fonction factor ? Essayez avec factor 12 et factor 144... factor 149.
La primitive expr <argument> permet l'évaluation d'expressions mathématiques. Les différents termes de l'expression sont des arguments de la commande et en tant que tels doivent être séparés les uns des autres par un espace ou une tabulation (au moins). Il est possible par cette commande de manipuler des nombres entiers quelconques (les nombres négatifs sont reconnus).
Essayer par exemple:
nature | opérateur(s) |
opérateurs arithmétiques | + - * / % ^ (puissance) |
opérateurs d'incrémentation | ++ - |
opérateurs relationnels | == != < > <= >= |
opérateurs d'affectation | = =+ =- =* =/ =% |
calcul de la racine carrée | sqrt |
Tester cet interpréteur avec les commandes:
Interpréter tout le
fichier en le passant à bc.
Solution
La structure de contrôle while/do
La structure de cette commande est la suivante:
La structure de contrôle for/do
La structure de cette commande est la suivante:
Un script simple
Ecrire un script shell
récursif compte <n> en shell (donc pas en C) qui affiche
les n premiers nombres dans l'ordre décroissant.
Solution
Le script de la factorielle
Ecrire un script shell factorielle
<n> qui calcule la factorielle du nombre n.
Solution
Un peu de détente avant d'attaquer la suite...
Nous allons tester la commande at avec par exemple
Essayer les commandes suivantes:
La commande talk <login d'un collègue> fonctionne encore mieux (normalement... ?!?)
En cas de crise d'amnésie, pensez à taper l'une des trois commandes suivantes:
Un détour par un traitement de texte sous UNIX
Essayez l'éditeur de textes vi par:
Un traitement de texte ?
Nous allons à présent créer un document sous LaTeX. Ce traitement de texte (gratuit) fait partie en standard d'une majorité de distributions LINUX.
\documentclass[a4paper,french]{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\pagestyle{plain}
\usepackage{babel}
\usepackage{color}
\makeatletter
\newcommand{\LyX}{L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX\spacefactor1000}
\makeatother
\begin{document}
{\centering {\LARGE BUREAU D'ETUDE PROGRAMMATION UNIX}\LARGE \par}
{\centering \textbf{\small Durée:} 8 heures\par}
{\centering \textbf {\small G. Desgeorge et D. Schang}\par}
\vspace*{1cm}
{\centering -----------------------------------------------------\par}
\textbf{\small Objectifs:}
posséder les principales commandes UNIX ainsi que
de bonnes bases en programmation
UNIX.
{\centering -----------------------------------------------------\par}
\bigskip{}
\vspace*{1cm}
\tableofcontents
\newpage
%====================================================================
\section{Introduction}
%====================================================================
Ce bureau d'études
est consacré à l'utilisation et à la manipulation
de
\textit{shells} (sous
UNIX, un \textit{shell} n'est rien d'autre qu'un interpéteur
qui cherche à
comprendre les commandes que vous entrez au clavier par exemple).
Steve Bourne a donné
son nom au premier shell utilisé sous UNIX, le Bourne-Shell:
\textit{sh}. D'autres
shells existent tels que le \textit{rsh} (Restricted Shell),
le \textit{csh} (C-Shell,
un shell dérivé du langage C), le \textit{bash} (Bourne
Again Shell), le ksh
(Korn-Shell). Ce sont ces deux derniers que nous étudierons
plus précisément
dans ce polycopié.
\section{Les commandes
usuelles}
{\noindent Pour lancer
un KORN SHELL taper la commande :}\\
\textbf{/bin/ksh} ou
\textbf{ksh}.\\
{\noindent Pour lancer
un BOURNE AGAIN SHELL taper la commande :}\\
\textbf{/bin/bash} et
\textbf{bash}.\\
{\noindent Remarque:
le BOURNE AGAIN SHELL est plus convivial sur vos machines,
cela tombe bien, il
est lancé par défaut sur vos machines au démarrage.}
\subsection{Rappel de
la liste des commandes usuelles}
\vspace{0.3cm}
{\centering \begin{tabular}{|l|l|}
\hline
Commande&
Descriptif\\
\hline
\hline
\textbf{ls}&
affichage du contenu
du répertoire\\
\hline
\textbf{mkdir}&
création d'un
répertoire (make directory)\\
\hline
\end{tabular}\par}
\vspace{0.3cm}
\end{document}
jeter un oeil à son
contenu (oui, il s'agit bien d'une partie du ``source'' de ce bureau d'études...)
$ latex premier.tex
on compile le document!
$ latex premier.tex
on recompile afin d'avoir une table des matières correcte
$ xdvi premier.dvi
$ dvips premier.dvi
crée le fichier postcript premier.ps
$ kghostview premier.ps
L'argument est-il numérique ?
On se propose d'écrire un script numeric <paramètre> qui permet de tester si le paramètre qui lui est passé est numérique ou non. Idéalement, le script devrait fonctionner comme ceci:
Si vous avez quelques difficultés, voici une piste à suivre:
Le script carre
Ecrire un script carre qui calcule et affiche les carrés des nombres entiers compris entre m et n, ces derniers étant passés en paramètres du script.
Le script saison
Ecrire un script saison permettant de connaître la saison courante. Voici quelques pistes: