Un tutorial kornshell

Creation: 28 mai 2013
Mise à jour:
Version: 1.0
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2013 Jean-Louis BICQUELET

KORNSHELL script

Bien que largement diffusé (par IBM) et utilisé dans de nombreux environnements, le korn shell est souvent sous employé, car confondu avec le borne shell.

Quelques notions générales

les différents shells

Le kornshell ou ksh est le shell d'AIX. Il s'inscrit dans la ligné des shell UNIX.Les principaux sont:

/bin/csh C shell (syntaxe proche de C)
/bin/sh Bourne shell (e plus vieux)
/bin/ksh Korn shell (variante du Bourne shell)
/usr/bin/bash public domain
/usr/bin/tcsh public domain

Sous AIX bash existe. Il est livré sous forme de rpm avec l'AIX toolbox ert installable.

Sous linux, la version de ksh est pdksh.

Sous AIX on peut changer de shell à l'aide de la commande chsh. On obtient la liste des shells disponibles.

# chsh
Current available shells:
               /bin/sh
               /bin/bsh
               /bin/csh
               /bin/ksh
               /bin/tsh
               /bin/ksh93
               /usr/bin/sh
               /usr/bin/bsh
               /usr/bin/csh
               /usr/bin/ksh
               /usr/bin/tsh
               /usr/bin/ksh93
               /usr/sbin/sliplogin
               /usr/local/sbin/noshell
               /usr/sbin/snappd
pilote's current login shell:
               /usr/bin/ksh
Change (yes) or (no)? >

Il suffit de donner le nom du shell en réponse. Celui-ci devriendra le shell par défaut du compte.

On peut a priori donner le nom d'un interpréteur de commande quelconque (perl, tcl par exemple).

Si on désire appeler un shell simplement, taper le nom de celui-ci. Exemple pour une session csh:

#csh
% help

If available, you can refer to the Base Document Library for general assistance

Some basic commands are:

man -k keyword - lists commands relevant to a keyword man command - prints out the manual pages for a command cat - concatenates files (and just prints them out) vi - text editor ls - lists contents of directory mail - sends and receives mail passwd - changes login password sccshelp - views information on the Source Code Control System smit - system management interface tool tset - sets terminal modes who - who is on the system write - writes to another user

To find programs about mail, use the command: man -k mail and print out the man command documentation via: man mail You can log out of the system by typing: exit %exit

lancement de script

Il est possible uniquement un shell. On a deux possibilité:

  • on lance la commande avec ksh nom_fichier
  • ou on ajoute en première ligne du fichier la ligne
    #!/bin/ksh
    
    et on rend le fichier exécutable (chmod u+x nom_fichier). Dans ce cas, il suffit de taper le nom du fichier.

ksh peut être lancé avec des paramètres:

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

environnement

fichiers de démarrage

Chaque shell possède des fichiers spécfiques qui sont lancés soit au démérrage de la session de l'utilisateur, soit au lancement du shell, soit quand celui-ci se termine. Le nom des fichiers dépend du type de shell (sh,csh,ksh,bash ...).

Dans le cadre du kornshell, les fichiers sont les suivants:

.login initialisalisation de l'environnement lors de la conenxion utilisateur
.profile initialisalisation de l'environnement lors du lancement du shell

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)

variables d'environnement

HOME le home directory ( répertoire de login )
PATH chemin de recherche pour l'exécution des commandes
CDPATH chemin de recherche pour la commande cd
MAIL chemin indiquant le répertoire du courrier
PS1 prompt système principal
PS2 prompt système secondaire
IFS internal field separator
SHELL indique le shell de login

utilisation du kornshell

Interprétation de commandes

Le shell est interprété. Lorsqu'une séquence se trouve entre deux caractères spéciaux '' "" ``. Le contenu se trouvant entre ces deux caractères est modifié et remplacé soit par substitution de variables, soir par substitution de commandes.

\ ne change pas le caractère qui suit
" ... " interprète l'expression sauf \ , $ subtitue une variable et ` une commande
' ... ' n'intrepète aucun des caractères
` ... ` substitution la chaine par le résultat de la commande

Variables shell spéciales

$1 - $9 paramètres dépendant de la position séparés par des blancs
$0 nom de la commande exécutée
$argv[20] 20eme élément de la ligne de commande
$# nombre de paramètres de la ligne de commande
$? status de sortie de la dernière commande exécutée. 0 indique pas d'erreur
$$ numéro de process de la commande
$! numéro de process de la dernière commande exécutée en arrière plan
$- options courrantes fournies lors de l'appel du shell
$* chaine conteant tous les arguments du shell (commençant à $1)
$@ même chose que $ mais quoté.
shift décale d'un argument: $2 devient $1 etc...

*:

"$*" étendu en 1 element : "$1 $2 $3"
"$@" étendu en 3 elements : "$1" "$2" "$3"

Evaluation des variables

$var désigne le contenu de la variable ou rien du tout si la la variable n'est pas définie.${var} désigne la même chose mais les parenthèses évitent les ambiguités.

Cette variable en ksh peut être interprétée. Les règles sont les suivantes:

Operation si str non défini ou nul sinon
var=${str:-expr} var= expr var= ${string}
var=${str:=expr} str= expr ; var= expr var= ${string}
var=${str:+expr} var becomes null var= expr
var=${str:?expr} expr is printed on stderr var= ${string}

tests

La syntaxe des tests sous ksh est de type test expr ou [ expr ] ou [[ exp ]].

Il ne faut pas oublier un espace apres [ et avant ], sinon la syntaxe est incorrecte.

Les test possibles sont:

-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
e1 -ne e2 vrai si différent
e1 -lt e2 vrai si plus petit
e1 -le e2 vrai si plus petit ou égal
e1 -ge e2 vrai si plus grand ou égal
e1 -gt e2 vrai si plus grand
! 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.

exemple:

i=3
if [ $i -lt 4 ]
then
       echo "plus petit qur 4"
fi

controle d'execution

Les structures de contrôle en ksh sont nombreuses.

boucle while avec test  
while(test)
do
       ....
done
boucle while pour lire un fichier  
cat fichier | while read line
do
       echo $line
done
liste d'éléments  
for i in 1 2 3 4
do
       echo $i
done