Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/05/2015, à 10:33

abou33

Utilisation du getopts dans une fonction (Bash/ksh)

Bonjour à tous,

Je viens de m’apercevoir que si j'utilise une deuxième fois la même fonction (avec des paramètres lus par getopts) dans un même script, la seconde exécution de la fonction ne lit pas les paramètres. Si je remplace le getopts par une lecture des paramètres avec $1, $2, ... ça fonctionne... Ouf, je ne suis pas fou...

Savez-vous pourquoi ou comment résoudre ce soucis ?

Je me monte une bibliothèque de fonction pour réécrire une p'tite appli et l'utilisation du getopts dans les fonctions m'aide énormément.

Voici mon script :

#!/bin/ksh
calculdate() {
# Calcule une date à plus ou moins n jours
# 
# Exemple :
#   Quelle est la date dans 15 jours (date début = date du jour) ?
#     calculdate -d 8 (aujourd'hui = 18/05/2015)
#        --> 26/05/2015
#   Quelle est la date de demain (date début = date du jour) ?
#     calculdate (aujourd'hui = 18/05/2015)
#        --> 19/05/2015
#   Quelle est la date il y a 7 jour (date début = date du jour) ?
#     calculdate -d 8 -s moins (aujourd'hui = 18/05/2015)
#        --> 10/05/2015
#   Quelle est la date 5 jours après le 30/06/2015 ?
#     calculdate -j 30 -m 05 -a 2015 -d 5
#        --> 04/06/2015
  echo debug $# $*  
  typeset -u sens

#  jour=$1
#  mois=$2
#  annee=$3
#  delai=$4
#  sens=$5
  while getopts :j:m:a:d:s: c
  do
    case $c in
         j)      jour=$OPTARG;;
         m)      mois=$OPTARG;;
         a)      annee=$OPTARG;;
         d)      delai=$OPTARG;;
         s)      sens=$OPTARG;;
         *)      echo "Parametre non connu !!!"
                 echo "calculdate [ -j <JJ> -m <MM> -a <CCAA> ] [ -d <nn> ] [ -s <PLUS|MOIS> ]"
                 return 99;;
    esac
  done
  
  # Initialisation des variables
  test -z $jour && jour=$(date '+%d')
  test -z $mois && mois=$(date '+%m')
  test -z $annee && annee=$(date '+%Y')
  test -z $delai && delai=1
  test -z $sens && sens="PLUS"
  test $sens == "MOINS" && avant="ago" || avant=""
  
  # formatage sur 2 chiffres du jour et du mois
  #jour=$(printf "%02d" $jour)
  #mois=$(printf "%02d" $mois)
  # Calcul de la date voulue
  newdate=$(date -d "$annee-$mois-$jour $delai day $avant" '+%d/%m/%Y')
  # Réponse de la fonction
  echo $newdate
  return 0
}
echo "Fonction calculdate :"
echo "--> Quelle est la date 5 jours après le 30/04/2015 ? (calculdate -j 30 -m 4 -a 2015 -d 5)"
calculdate -j 30 -m 04 -a 2015 -d 5
calculdate -j 20 -m 03 -a 2014 -d 4
exit 0

Abou33

Hors ligne

#2 Le 19/05/2015, à 13:04

pingouinux

Re : Utilisation du getopts dans une fonction (Bash/ksh)

Bonjour,
Je n'ai pas ksh pour tester, mais en bash, il suffit de remplacer

calculdate() {
...........................
}

par

calculdate() (
...........................
)

La fonction est alors exécutée dans un sous-shell.

Hors ligne

#3 Le 19/05/2015, à 15:30

credenhill

Re : Utilisation du getopts dans une fonction (Bash/ksh)

hello
essayer

...
OPTIND=1
  while getopts :j:m:a:d:s: c
  ...

Hors ligne

#4 Le 19/05/2015, à 16:36

abou33

Re : Utilisation du getopts dans une fonction (Bash/ksh)

Je ne connaissais pas cette astuce... C'est très intéressant.

Merci à tous pour toutes vos réponses.

Abou33

pingouinux a écrit :

Bonjour,
Je n'ai pas ksh pour tester, mais en bash, il suffit de remplacer

calculdate() {
...........................
}

par

calculdate() (
...........................
)

La fonction est alors exécutée dans un sous-shell.

Hors ligne