Processus séquentiels
proc1
proc2
proc3
proc1 ; proc2 ; proc3
Processus en parallèles
proc1 & proc2 & proc3 &
Redirection des entrées-sorties
< |
l'entrée standard est lu à partir d'un fichier |
> |
La sortie standard est redirigée dans un fichier (RAZ du fichier) |
>> |
La sortie standard est redirigée dans un fichier (concaténation
du fichier) |
2> |
les erreurs sont redirigées dans un fichier |
2>&1 |
les erreurs sont redirigées dans le même fichier que la
sortie standard |
Here Document
Création de fichier dans un script
cmde<<[-] Délimiteur
ligne1
ligne2
ligne3
...
Délimiteur
Si - est ajouté, les tabulations de début de ligne
sont supprimées du document.
exemple
cat > fichier << EOF
abc
def
EOF
Les pipes
proc1 | proc2
équivaut à :
proc1 > fich
proc2 < fich
Génération des noms de fichiers
* |
n'importe quelle chaîne de caractères |
? |
n'importe quel caractère |
[ ... ] |
n'importe quel caractère décrit entre les crochets |
Le login
exécution du fichier .login pour initialiser l'environnement
exécution du fichier .profile pour initialiser l'environnement
Si on positionne la variable ENV, alors le fichier spécifié
(en général $HOME/.kshrc) est exécuté à
chaque ouverture de session shell (pour les alias)
Les paramètres du shell
HOME |
le home directory ( répertoire de login ) |
PATH |
chemin de recherche pou l'exécution des commandes |
CDPATH |
chemin de recherche pour la commande cd |
MAIL |
chemin indiquant le répertoire du courrier |
PS1 |
primary system prompt |
PS2 |
secondary system prompt |
IFS |
internal field separator |
SHELL |
indique le shell de login |
L'exécution d'un script en Korn Shell
ksh nom_fichier
ou rendre le fichier exécutable (chmod u+x nom_fichier) puis
taper le nom du fichier
Pour forcer l'exécution du fichier en Korn Shell, le fichier
doit commencer par #!/bin/ksh
ksh -n nom_fichier |
interprète les commandes sans les exécuter |
ksh -v nom_fichier |
imprime les lignes comme elles sont lues |
ksh -x nom_fichier |
imprime les lignes comme elles sont interprétées |
Les variables
variable = valeur |
affectation (Attention , ne pas mettre d'espace autour de =) |
$variable |
valeur de la variable |
${ variable } |
valeur de la variable (permet d'éviter certaines ambiguités:
si a="var",${a}b renvoie varb alors que $ab est invalide) |
récupération des paramètres
dans la ligne de commande
$0 |
nom de la commande |
$ n |
nieme paramètre |
$# |
nombre de paramètres |
$* $@ |
liste de tous les paramètres La signification de $* et de $@
est identique. Cependant, lorsque "$*" est utilisé comme argument
de commande, il est équivalent à "$1 $2 " alors que "$@"
est équivalent à "$1" "$2" |
Pour décaler les paramètres, on peut utiliser la commande
shift
Quelques variables spéciales
$$ |
le numéro de processus de la dernière commande |
$? |
Status de la dernière commande |
Les caractères spéciaux
\ |
banalise le caractère suivant |
" ... " |
banalise les caractères sauf \ , $ et ` |
' ... ' |
banalise tous les caractères |
` ... ` |
substitution de commande |
Les instructions
Les commandes if , while , until teste le status de
la commande. (voir le man pour determiner le status renvoyé par
une commande particuliere, en géneral si la commande s'execute correctement,
le status est vrai) Attention mettre une négation devant la commande
(if ! cmde) ne permet pas de tester l'échec de la commande car la
négation s'applique au résultat de la commande et non pas
à son status.
Dans cette optique, le test est considéré comme une commande,
on peut d'ailleurs l'utiliser sur une ligne de commande.
if
if cmde
then
liste_commandes
[elif liste_commandes
then
liste_commandes] ...
[else liste_commandes]
fi
if test -f $1
then
file $1
else
echo " le fichier n'existe pas "
fi
if grep jean personnel
then
echo jean >> disponible
elif grep pierre personnel
then
echo pierre >> disponible
else
echo vide >> disponible
fi
while
while commande
do
liste_commandes
done
while [ -r " $1 " ]
do
cat $1 >> concat
shift
done
until
until commande
do
liste_commandes
done
until [ ! -r " $1 " ]
do
cat $1 >> concat
shift
done
case
case para in
choix1[|choix2] ... ) liste_commandes ;;
esac
case $1 in
-d | -r ) rmdir $dir
echo "option -d ou -r ";;
-o ) echo "option -o ";;
* ) echo "réponse incorrecte ";;
esac
for
for para [in liste]
do
liste_commandes
done
La variable para prend successivement les valeurs de la liste
si la liste est omise, para prend alors les valeurs passées
en paramètres du script
for i in `ls`
do
cp $i /dir/$i
echo "$i copie "
done
N'oublier pas les ` qui force l'exécution du ls.
for dir in /dev /usr /users/bin /lib
do
num=`ls $dir|wc -w`
echo "$num fichiers dans $dir "
done
for i
do
echo $i
done
les tests
N'oubliez pas que le test est une commande qui peut être exécutée
directement sur la ligne de commande
test expr ou [ expr ] ou [[ exp ]] (Attention il faut un espace apres
[ et avant ])
ou expr vaut :
-r fichier |
vrai si le fichier existe et est accessible en lecture (R) |
-w fichier |
vrai si le fichier existe et est accessible en écriture (W) |
-x fichier |
vrai si le fichier existe et est exécutable (X) |
-f fichier |
vrai si le fichier existe et est un fichier régulier |
-d fichier |
vrai si le fichier existe et est un répertoire |
-s fichier |
vrai si le fichier existe et a une taille non nulle |
-L fichier |
vrai si le fichier existe et est un lien symbolique |
s1 = s2 |
vrai si les deux expressions sont égales |
s1 != s2 |
vrai si les deux expressions sont différentes |
s1 |
vrai si s1 n'est pas la chaîne nulle |
e1 -eq e2 |
vrai si les deux entiers e1 et e2 sont algébriquement égaux
( autres comparaisons : -ne , -gt , -ge , -lt , -le) |
! |
négation unaire |
-a |
opération binaire ET |
-o |
opération binaire OU |
(Expression) |
Vrai si Expression est vraie. Permet de regrouper des expressions. |
Expression1 && Expression2 |
Vrai si Expression1 et Expression2 sont vraies. |
Expression1 || Expression2 |
Vrai si Expression1 ou Expression2 est vraie. |
divers
# |
commentaires , mais #!/bin/sh en début de fichier force l'exécution
en Bourne Shell |
( cmde ) |
exécute la commande dans un sous-shell |
read a |
lecture d'une entrée pendant l'exécution d'un script |
exit num |
renvoie le status de la commande (en général 0 la commande
s'est bien exécutée) |
return num |
code d'erreur |
. script |
exécution du script dans le shell courant |
eval arg |
interprète arg avant de l'exécuter |
cmd1 && cmd2 |
séparateur conditionnel (cmd2 sera exécuté si
cmd1 s'est exécuté correctement) |
cmd1 || cmd2 |
séparateur conditionnel (cmd2 sera exécuté si
cmd1 ne s'est pas exécuté correctement) |
nom_fonction ()
{ liste_commandes ;} |
définition d'une fonction |
exec arg |
exécute la commande dans un nouveau shell |
set var |
initialisation d'une variable
liste de tous les paramètres du système
positionne les paramètres $i ( set a b c positionne $1 à
a, $2 à b et $3 à c) |
unset var |
raz d'une variable |
type cmde |
indique la localisation d'une commande |
readonly var |
empêche la modification d'une variable |
Les expressions
let exp ou (( exp ))
let x=x+2
(( x > 10 ))
Attention le test de l'égalité est ==
Les fonctions
function Identificateur {Liste ;}
La liste est composée de deux partie : la déclaration
de variables et les commandes
On peut faire des fonctions recursives
Déclaration des variables
typeset var |
déclaration d'une chaîne de caractères |
integer var
typeset -i var |
déclaration d'un entier |
typeset -r var=valeur
readonly var=valeur |
définition d'une constante |
On peut utiliser des tableaux qui ne sont déclarés que lors
de leur assignation: tab[100]=toto
Les librairies
On créé un répertoire dans lequel on stocke les fichiers
contenant les fonctions (le nom du fichier doit être le même
que le nom de la fonction)
Pour utiliser cette librairie, positionner la variable FPATH,
puis importer les fonctions (par autoload ou typeset -fu)
FPATH=$HOME/lib/rep1:$HOME/lib/rep2
autoload init
tyteset -fu ecr
On peut définir des fonctions dans le fichiers définie par
ENV mais elles ne seront visibles que du shell interactif, pour les rendre
toujours visible il faut les exporter par typeset -fx fonc
Recuperation des résultats de la fonction
On positionne le status de la fonction par return (récupéré
par $?)
On renvoie une valeur par l'intermédiaire de la commande echo
(récupéré par : a=`fonction` ou a=$(fonction)
Les alias
alias |
donne la liste des alias |
alias nom=valeur |
initialisation d'un alias |
Les alias suivants sont définies par défaut par le shell
autoload='typeset -fu'
false='let 0'
functions='typeset -f'
hash='alias -t'
history='fc -l'
integer='typeset -i'
nohup='nohup '
r='fc -e -'
true=':'
type='whence -v'
GETOPTS
Cette commande permet de récuperer facilement les options passées
en paramètre du script.
Syntaxe générale
getopts Chaîne_options Nom [Argument ...]
Nom prend successivement comme valeur celles passées en paramètre
du script.
Les seules valeurs valides sont données par chaine_option (voir
ci dessous pour plus de détails)
Par exemple
while getops vy argument
do
case $argument in
v) ...;;
y) ... ;;
esac
done
traitement des erreurs
Pour rajouter un traitement d'erreur automatique, il suffit de rajouter
: devant la liste des options valides
Lorsque l'utilisateur utilise une option non valide, getopts
renvoie \?
while getops :vy argument
do
case $argument in
v) ...;;
y) ... ;;
\?) ... ; exit ;;
esac
done
Option avec arguments (et gestion des erreurs)
Pour permettre de saisir un paramètre apres une option, il suffit
de rajouter : après l'option concernée
La variable OPTARG contient le paramètre Si l'utilisateur
omet le paramètre, getops renvoie : et OPTARG
l'option concernée.
while getops :y: argument
do
case $argument in
y) ... ; arg=$OPTARG;;
:) echo " l'option -$OPTARG a besoin d'un argument " ; exit ;;
\?) ... ; exit ;;
esac
done
La gestion des menus
select Identificateur [in liste_choix]
do
&o
commande
...
done
La commande select écrit sur la sortie d'erreur standard
la liste des choix, chacun étant précédé d'un
numéro. Si in liste_choix n'est pas spécifié,
les paramètres positionnels sont utilisés.
Le contenu de la variable PS3 s'affiche et l'entrée standard
est lu. Si le numéro d'un des mots listés est saisie, le
paramètre Identificateur prend la valeur de ce mot.
Si la ligne est vide, la liste s'affiche de nouveau. Sinon, la valeur
du paramètre Identificateur est "". Le contenu de la ligne lue à
partir de l'entrée standard est sauvegardé dans le Paramètre
REPLY. La liste est exécutée pour chaque sélection
jusqu'à un caractère d'interruption ou de fin de fichier.
PS3=" votre choix "
select menu_list in "choix 1" "choix 2" "fin"
do
case $menu_list in
"choix 1").... ;;
"choix 2")... ;;
"fin") exit 0 ;;
"") echo "$REPLY est une option invalide "
esac
done
Positionnement des options
set : Les options de cette commande sont :
-n |
Lit les commandes en recherchant les erreurs de syntaxe, sans les exécuter.
Cette option est ignorée par les shells interactifs. |
-t |
Génère une sortie après la lecture et l'exécution
d'une commande. |
-v |
Ecrit les lignes d'entrée du shell à mesure qu'elles
sont lues. |
-x |
Ecrit les commandes et leurs arguments à mesure qu'ils sont
exécutés. |
- |
Désactive les options -x et -v et interrompt la vérification
des arguments. |
Remplacer le signe - par + désactive l'option. Celles-ci peuvent
aussi être utilisées sur appel du shell.
Les options en cours peuvent être visualisées dans $-.
Sauf si -A est spécifiée, les arguments restants sont des
paramètres positionnels et sont affectés, dans l'ordre, à
$1, $2, etc.
Si aucun argument n'est spécifié, les noms et les valeurs
de tous les paramètres sont écrits sur la sortie standard.
Si + est le seul argument spécifié, les noms de tous les
paramètres sont écrits.