home

commandes Unix

sh

csh

ksh

expressions régulières

sed

awk

Les shells UNIX : Le Korn Shell


Processus séquentiels
Processus en parallèles
Redirection des entrées-sorties
Here document
Les pipes Génération des noms de fichiers Le login Les paramètres du shell L'exécution d'un script en Korn Shell Les variables
récupération des paramètres dans la ligne de commande
Quelques variables spéciales
Les caractères spéciaux Les instructions
if
while
until
case
for
les tests
divers
Les expressions
Les fonctions
Déclaration des variables
Les librairies
Recuperation des résultats de la fonction
Les alias GETOPTS
Syntaxe générale
traitement des erreurs
Option avec arguments (et erreurs)
La gestion des menus Positionnement des options

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 
	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.

© Isabelle Vollant ( http://www.multimania.com/vollant )


home

commandes Unix

sh

csh

ksh

expressions régulières

sed

awk

mise à jour le 10/04/97
Francité Click Here!