Pages : 1
#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