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 11/03/2020, à 11:53

outis

Aide sur Exercice à rendre

Bonjour, j'ai un exercice auquel j'ai écrit un script mais malheureusement il y'a plusieurs choses qui ne fonctionnent pas comme il faut.
Pouvez vous m'aider à corriger ce qui ne va pas .
Tout d'abord voici l'énonce:
1.2Créez un script 64naissances qui crée et met à jour un fichier intégrant le nom, le prénom et la date de naissance des étudiants de l'ISFCE. Ce script utilisera une fonction chkdate qui permet de s'assurer de la validité de la date de naissance, qui doit être sous le format jj/mm/yyyy, en exigeant une date supérieure à 1900 mais inférieure à la date du jour de saisie, du nombre de jours de chaque mois et des années bissextiles.
Le fichier créé sera dans votre répertoire personnel et se nommera etudiants.txt. Les champs seront séparés par des :

et voici le script que j'ai écrit:

#!/bin/bash
#*******************************************************************************************
#*******************************************Fonctions***************************************
#*******************************************************************************************
function chekdate {
shopt -s extglob 
datenaiss=$1 
set `date +"%d %m %Y"`
currentd=$1
currentm=$2
currenty=$3
echo
datenaiss=$(echo "$datenaiss" | tr "/" " ")
 set $datenaiss
     jour=$1
     month=$2
     an=$3
#le format date ==> modèl
if [[ $datenaiss =  @([0-2][1-9]|3[0-1])" "@(0[1-9]|1[0-2])" "@([1-2][0-9][0-9][0-9]) && $an -gt 1900 && $an -le $currenty ]]
    then #an < date saisie 
       if ! [[ $jour -eq $currentd && $month -eq $currentm && $an -eq $currenty ]]
           then #jour < jours mois
           case $month in
            01|03|05|07|09|11)
              if [[ $jour -le 31 ]]
                then eval=1
              fi
             ;;
            04|06|08|10|12) 
              if [[ $jour -le 30 ]]
               then eval=1
              fi
             ;;
             02) # jour < jours d'années bissextiles
              if [[ $(($an%400 == 0 )) ]] || [[ $(($an%4 == 0)) && $(($an%100 != 0)) ]]
                then if [[ $jour -lt 30 ]]
                        then eval=1
                     fi
               else  if [[ $jour -lt 29 ]]
                        then eval=1
                     fi
              fi
             ;;
             esac     
        fi     
else 
   echo "Date de naissance erroné"
   eval=0
fi
}
#*******************************************************************************************
#******************************programme principale
#********************************************************************************************
per=$HOME
nomfich="$HOME/etudiants.txt"
touch $nomfich
read -p "Introduisez le nom ,prénom et date de naissance de chaque étudiant séparés par : et end pour terminer: " rec
while [[ $rec != end  ]]
do
     verifier=$(echo "$rec" | tr ":" " ")
     set $verifier
     chekdate $3
      while [[ $eval -eq 0 && $rec -ne end  ]]
         do
           read -p "Réintroduisez l'enregistrement avec une bonne date de naissance : " rec
         done
   
     
            echo "$rec" >> $nomfich
     
read -p "Introduisez l'enregistrement suivant: " rec
done
cat $nomfich
exit

Merci d'avance.

Dernière modification par outis (Le 11/03/2020, à 11:55)

Hors ligne

#2 Le 11/03/2020, à 12:34

Watael

Re : Aide sur Exercice à rendre

salut,

plutôt que d'entrer les données dans le format imposé, puis de défaire le format pour vérifier les données,
je ferais un read par donnée, et si elles sont validées, alors je leur donnerais le format souhaité.
ça éviterais le set

case $month in 0[13579]|11) ...

il faut tester le code de retour de la fonction au lieu de tester une varaible qu'elle assigne :

while checkDate && test "$rec" != "end"; do ...

avec

checkDate()
{
...
   return $eval
}

des tests arithmétiques simples :

(( jour < 29 && (eval=1) ))

ou

((eval=jour<29?1:0))

pareil pour le calcul des années bissextiles : les crochets doubles sont superflus, il vaut mieux faire un Évaluation arithmétique

Dernière modification par Watael (Le 11/03/2020, à 13:49)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 11/03/2020, à 13:35

pingouinux

Re : Aide sur Exercice à rendre

Bonjour,
La fonction date t'indique directement si la date fournie est valide ou non.
Exemples

$ date -d 2020-02-29 &>/dev/null && echo ok || echo ko
ok

$ date -d 2019-02-29 &>/dev/null && echo ok || echo ko
ko

Pour voir si une date est plus récente qu'une autre, il suffit de comparer le nombre de secondes écoulées depuis (ou jusqu'au 1970-01-01) :
Exemples

$ sec_1900=$(date -ud 1900-01-01 +%s)
$ sec_epoch=$(date -ud 1970-01-01 +%s)
$ sec_now=$(date -u +%s)

$ echo $sec_1900 $sec_epoch $sec_now
-2208988800 0 1583929858

Hors ligne

#4 Le 13/03/2020, à 17:48

outis

Re : Aide sur Exercice à rendre

Merci pour vos réponses

Hors ligne