Memo KSH

De Avided.info
Aller à : navigation, rechercher

KSH

Les fonctions

Creer une fonction

function ma_fonction {
code
}

utiliser une fonction

ma_fonction param1

supprimer une fonction

unset -f ma_fonction

lister les fonctions dans la session en cours

typeset +f

Lister les fonctions active dans la session courrante avec leur code

typeset -f

Recuperer les N 1er ou N dernier caractere d'une variable VAR

typeset -RN VAR_N_DERNIER=$VAR

typeset -LN VAR_N_PREMIER=$VAR

Ces options de typeset sont plutôt destiné à justifier les variables sur un certaine nombre de caractères. exemple: le contenu du var contenant 11 caracteres, mais on desire le justifier a droite sur 7 caracteres. Attention : Il est indiqué dans la docn que cela ne fonctionne pas avec des variables de type integer. Donc si vous avez utiliser typeset -i VAR faite attention. J'ai eu des soucis avec une variable qui contenait 0.9.8e qui a été résolue grace "$VAR" dans la ligne suivante

typeset -L7 VAR="$VAR"

ex:

VAR=jean-renaud
echo ${#VAR}
11
echo -${VAR}-
-jean-renaud-
typeset -L7 VAR="$VAR"
echo ${#VAR}
7
echo -${VAR}-
-jean-re-


getopts

Sur RedHat ksh a un comportement différent de pdksh Il faudrait voir si cette différence apparaît aussi sur att-ksh sur les autres unix.

Si on utilise "getopts" dans une fonction. Au 1er appel de la fonction cela fonctionne correctement, mais les appel suivant ne vois plus l'option.

ex: la fonction

$ fun1(){
 while getopts "azerty" opt
 do
   echo "$opt :  $OPTARG
 done
}

1er execution de la fonction $ fun1 -a a :

2eme exécution de la fonction

$ fun1 -a
$

Pour résoudre le problème il faut ajouter avant le getopts la ligne

OPTIND=1

ksh88 ne gère pas les variables local

ex:

fun1(){
  OPTIND=1
  while getopts "azerty" opt
  do
    echo "$opt :  $OPTARG"
  done
}

1er execution

$ fun1 -a
a :

2ème execution

$ fun1 -a
a :

3eme execution avec une autre option

$ fun1 -z
z :

Gestion des Options

function f3
{
while getopts ":abcd:" opts; do
   typeset OPTARG OPTIND
   case "$opts" in
     a)
        typeset LES_OPTIONS="$LES_OPTIONS $opts"
     ;;
     b)
        typeset LES_OPTIONS="$LES_OPTIONS $opts"
     ;;
     c)
        typeset LES_OPTIONS="$LES_OPTIONS $opts"
     ;;
     d)
        typeset LES_OPTIONS="$LES_OPTIONS $opts:$OPTAGR"
     ;;
     \?)
        echo "option $opts non reconue"
     ;;
  esac
done
#shift $(( $OPTIND-1 ))
shift $(( --OPTIND ))
echo option : $LES_OPTIONS - argument : $*
}