Korn shell (ksh) : un petit mémo

Rédigé par niconux Aucun commentaire
Classé dans : Système, Debian, Développement, Mémo Mots clés : ksh, variable, fonction, korn shell

J'ai eu dernièrement à réutiliser le Korn shell (ou ksh) sur GNU/Linux et Solaris, je me suis dit que cela serait aussi une bonne occasion de faire un petit mémo regroupant un ensemble de commandes, d'exemples, ... permettant de répondre à des besoins récurrents.

Avant toute chose, un peu d'histoire, le Korn shell ou ksh est un shell Unix — mais il tourne aussi nativement sur plate-forme Microsoft Windows — développé par David Korn au début des années 1980 (la première version est sortie en 1983).

Compatible avec le Bourne shell, le Korn shell inclut également un grand nombre de fonctionnalités du C shell ; il permet également des fonctions de scripting avancées utilisées dans des langages de programmation plus évolués comme awk, sed, TCL et Perl.

Voyons maintenant un petit panel de commandes, d'exemples qui je l'espère vous seront pratique pour developper vos propres scripts.

Dans la suite de l'article la version de ksh utilisée sera la version 93 (ksh93). Il se peut que certains exemples proposés ne soient pas compatible si vous utilisez une version antérieure de ksh.

Accès rapide :

Installation sous Debian Wheezy

L'installation est très simple et se fera via la commande apt.

$ sudo apt-get update
$ sudo apt-get install ksh

 

Votre premier script

Tout script ksh devra commencer par la ligne suivante :

#!/bin/ksh

Nous allors tout de même enrichir ce premier script par l'affichage d'un message dans la sortie standard.

#!/bin/ksh
#Notre premier script ksh
echo "Hello world"
  • Explications :

- La première ligne indique où se trouve le shell sur votre système, si le shell ksh n'est pas présent dans le dossier /bin il vous faudra le changer en fonction de son emplacement sur votre système.

Remarque : La commande /bin/ksh peut être un lien symbolique sur une autre commande, typiquement sous Debian Wheezy la commande /bin/ksh est en fait un lien symbolique vers la commande /bin/ksh93

- Le caractère # en début de ligne indique que la ligne est une ligne de commentaire.

- La commande echo permet d'écrire un message contenu entre les guillemets ("") sur la sortie standard (console).

  • Exécution :

Pour pouvoir exécuter ce script et les suivants, il vous faudra enregistrer votre script dans un fichier avec l'extension .ksh, d'y ajouter un droit exécution à l'aide de la commande chmod comme suit :

chmod +x monScript.ksh

et de l'exécuter comme suit :

./monScript.ksh

Revenir au début de l'article

Les variables

Définir des variables dans un script ksh se fait comme suit :

#Chemin d'accès au home de l'utilisateur bob
VARIABLE="/home/bob" 

#Enregistre dans la variable HOSTNAME le résultat de l'appel à la
# commande hostname
HOSTNAME=$(hostname) 

#Affichage de la date courante
DATE=$(date)

#Affichage de la date courante au format AAAA-MM-JJ
SHORTDATE=$(date +"%Y-%m-%d")

#Affichage de la valeur des variables précédentes
echo "$VARIABLE" "$HOSTNAME"
echo "$DATE"
echo "$SHORTDATE"

Des variables prédéfinies existent en ksh comme par exemple :

$PWD : qui retourne le dossier courant

$0 : nom de la commande, typiquement l'appel de votre script.

$1 .... $n : argument 1 à n passé à votre script (ou fonction comme nous le verrons plus tard)

$# : nombre d'argument passé en paramètre

$? : statut de retour de votre script.

Revenir au début de l'article

Les caractères spéciaux

 \     banalise le caractère suivant
" ... "     banalise les caractères sauf \ , $ et `
' ... '     banalise tous les caractères
` ... `     substitution de commande

Revenir au début de l'article

Les operateurs

ksh fournit un ensemble d'opérateurs permettant de faire un ensemble de comparaison entre deux paramètres :

-n str : TRUE si le contenu de la variable str est non vide
-z str : TRUE si le contenu de la variable str est vide
str1=str2 : TRUE si les contenus des deux variables sont identiques
str1!=str2 : TRUE si les contenus des deux variables sont différents
str1<str2 : TRUE si str1 est inférieur à str2
str1>str2 : TRUE si str1 est supérieur à str2
-d path : TRUE si le dossier path existe
-f file : TRUE si le fichier file existe

 

Revenir au début de l'article

Les instructions

Les commandes if , while , until teste le statut de la commande. (voir le man pour determiner le statut renvoyé par une commande particulière, en géneral si la commande s'exécute correctement, le statut 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 statut.
Dans cette optique, le test est considéré comme une commande, on peut d'ailleurs l'utiliser sur une ligne de commande.

  • IF

Syntaxe

if cmde
    then
        liste_commandes
    [else liste_commandes]
fi

Exemples
 

BOBPATH="/home/bob"
if [ -d $VARIABLE ]
then 
  echo "Le repertoire existe"
fi

Un autre exemple utilisant une expression régulière, validant la saisie d'une date.

#!/bin/ksh

echo "Saisir la date d'exploitation au format DDMMYYYY (ex : 26032011)"
read datexploit
if [[ "$datexploit" = @((0[1-9]|1[0-9]|2[0-9]|3[0-1])(0[1-9]|1[012])(2[0-9][0-9][0-9])) ]]
then
    echo "Date cohérente"
else
    echo "ATTENTION : Date incorrecte"
fi
  • FOR

Syntaxe

for para [in liste]    
do
    liste_commandes
done

Exemple

ELEMENT=`ls -d $BOBPATH/*`
for SUBDIR in ${ELEMENT}
do
	echo "dossier : " $SUBDIR
done
  • CASE

Syntaxe

case para in
    choix1[|choix2] ... ) liste_commandes ;;
esac

Exemple

echo "Veuillez saisir votre choix :  O ou N"
read checkdata
case "$checkdata" in
	"O" ) echo "Choix Oui effectue"
	  ;;
	"N" ) echo "Choix Non effectue"
	  ;;
	* ) echo "Choix autre que Oui ou Non"
	  ;;
esac

 

  • WHILE

Syntaxe

while commande
do
    liste_commandes
done
 

Exemple

#!/bin/ksh
choix="1"
while [ "$choix" != "0" ]
do
   	echo "Veuillez renseigner votre choix, (saisir 0 pour finir la saisie) : "
	read choix
	echo "Votre choix : " $choix
done
  • UNTIL

Syntaxe

until commande
do
    liste_commandes
done

Exemple

#!/bin/ksh
choix="1"
until [ "$choix" = "0" ]
do
   	echo "Veuillez renseigner votre choix, (saisir 0 pour finir la saisie) : "
	read choix
	echo "Votre choix : " $choix
done

 

Revenir au début de l'article


Les fonctions

ksh permet de créer des fonctions vous permettant de rendre plus lisible votre script en regroupant des instructions devant répondre à un fonctionnel bien précis.

La méthode ainsi créée pourra être appelé ensuite où vous voulez dans le script. A notre que la fonction devra être déclarer avant de l'utiliser.

Syntaxe :

function myfunction

{

#instructions

}

Exemple :

  • Fonction sans paramètre

Le script suivant permet d'afficher un menu demandant de saisir un choix parmi 1, 2, 3 et selon la saisie affiche un libellé correspondant au choix effectué.

Le choix 0 permet de stopper l'affichage du menu.

#!/bin/ksh

function menu
{

echo " *** Menu ***"
echo "1 - choix 1  "
echo "2 - choix 2  "
echo "3 - choix 3  "
echo "0 - quitter  "
echo "Veuillez saisir votre choix : "
read choix
case "$choix" in
	"1" ) echo "Choix 1 effectue"
	  ;;
	"2" ) echo "Choix 2 effectue"
	  ;;
	"3" ) echo "Choix 3 effectue"
	  ;;
	"0" ) echo "Choix 0 effectue"
	  ;;
	* ) echo "Choix inconnu effectue"
	  ;;
esac

}


while [ "$choix" != "0" ]
do
   	menu
done
  • Fonction avec paramètres
#!/bin/ksh

function process
{

echo "valeur premier paramètre :" $1
echo "valeur premier paramètre :" $2
echo "nombre de paramètre :" $#
}

process "Hello" "World"

L'exécution de ce script aura pour effet d'afficher sur la console :

valeur premier paramètre : Hello
valeur premier paramètre : World
nombre de paramètre : 2

Revenir au début de l'article

Traitement de la valeur d'une variable selon l'application d'un pattern

Exemple :

 

#!/bin/ksh

original_file="script.ksh"
filename=${original_file%%.*}
##cherche le pattern validant ".*" en fin de valeur de la variable,
## supprime la chaine de caractère trouvée et retourne le reste)
echo $filename
file_ext=${original_file##*.}
##même chose que précédemment mais en partant du début.
echo $file_ext
##affiche le nom du fichier traité
echo $original

Exécuter ce script permettra de connaitre l'extension d'un fichier ainsi que son nom (basename), voici le résultat de l'exécution de ce script :

script
ksh
script.ksh

Revenir au début de l'article

Exemples utiles

Vous retrouverez dans cette rubrique quelques bouts de code ksh répondant à des problématiques très précise mais très souvent exploités dans des scripts de plus grosse envergure.

  • Exécuter un traitement sur l'itération d'une liste de valeur
#!/bin/ksh

for i in {1..10}
do
	echo "Iteration : $i "
done
#!/bin/ksh

for i in 1 2 3 4 5
do
	echo "Iteration : $i "
done
  • Exécuter un traitement en utilisant une approche « i++ »
#!/bin/ksh

i=0
while [[ $i -lt 10 ]]
do
	echo "Iteration : $i "
	(( i += 1 ))
done
  • Utilisation d'une expression régulière pour valider la valeur d'une variable

Dans cet exemple vous validons la valeur d'une date saisie par l'utilisateur en fonction d'un pattern attendu.

#!/bin/ksh

echo "Saisir la date d'exploitation au format DDMMYYYY (ex : 26032011)"
read datexploit
if [[ "$datexploit" = @((0[1-9]|1[0-9]|2[0-9]|3[0-1])(0[1-9]|1[012])(2[0-9][0-9][0-9])) ]]
then
    echo "Date cohérente"
else
    echo "ATTENTION : Date incorrecte"
fi

Revenir au début de l'article

Aller plus loin ...

J'espère que ce (très) petit tour d'horizon des fonctionnalités que propose ksh vous aura plu. Si vous voulez aller plus loin, je vous recommande vivement le site officiel de ksh (section documentation) ou de taper man ksh dans votre console.

Revenir au début de l'article

Écrire un commentaire

Quelle est le deuxième caractère du mot e4ljfin ?

Fil RSS des commentaires de cet article