#26 Le 01/07/2020, à 18:04
- Tomy-Gunn
Re : Script Bash
Autant pour moi...
Merci à tous pour votre aide et vos conseils sans lesquels je serais encore bien loin du résultat...
Hors ligne
#27 Le 01/07/2020, à 18:32
- pingouinux
Re : Script Bash
Pour info, si on veut juste vérifier qu'une date est correcte :
$ date -d 2019-02-30 &>/dev/null && echo Bonne date || echo Mauvaise date
Mauvaise date
$ date -d 2019-02-25 &>/dev/null && echo Bonne date || echo Mauvaise date
Bonne date
Hors ligne
#28 Le 01/07/2020, à 21:12
- sputnick
Re : Script Bash
Ton script, un peu corrigé:
- pas besoin de $ sur les variables en contexte arithmétique ((i<=30)) comme dans le dernier if
- prends l'habitude de formater/indenter ton code proprement, ça t'aidera toi et aussi ceux qui doivent te lire
- si le script sor et erreur, il affiche sur la sortie d'erreur STDERR avec >&2 et une sortie en erreur: exit 1. On peut tester la valeur de retour des commandes avec 'false; echo $?'
#!/bin/bash
#VARIABLE DATE DU JOUR
read jourActu moisActu anneeActu < <(date +'%d %m %Y')
#INSERTION DATE DE NAISSANCE
read -p 'Entrez votre jour de naissance :' jourNaissance
read -p 'Entrez votre mois de naissance :' moisNaissance
read -p 'Entrez votre année de naissance :' anneeNaissance
# TEST VARIABLES
if [[ $jourNaissance =~ ^[0-9]{1,2}$ ]] \
&& ((jourNaissance >=1 && jourNaissance <=31)) \
&& [[ $moisNaissance =~ ^[0-9]{1,2}$ ]] \
&& ((moisNaissance >=1 && moisNaissance <=12)) \
&& [[ $anneeNaissance =~ ^[0-9]{4}$ ]] \
&& ((anneeNaissance > 1900 && anneeNaissance < anneeActu)) \
&& ((moisActu < moisNaissance))
then
age=$((anneeActu-anneeNaissance-1))
else
if [[ $jourNaissance =~ ^[0-9]{1,2} ]] \
&& ((jourNaissance >=1 && $jourNaissance <=31)) \
&& [[ $moisNaissance =~ ^[0-9]{1,2}$ ]] \
&& ((moisNaissance >=1 && moisNaissance <=12)) \
&& [[ $anneeNaissance =~ ^[0-9]{4}$ ]] \
&& ((anneeNaissance > 1900 && anneeNaissance < anneeActu)) \
&& ((moisActu > moisNaissance))
then
age=$((anneeActu-anneeNaissance))
else
echo "Données incorrectes">&2
fi
fi
i=$age
if ((i<=30)); then
echo "Vous avez $age ans, vous êtes jeune."
elif ((i>30 && i<60)); then
echo "Vous avez $age ans."
elif ((i>=60 && i<=100)); then
echo "Vous avez $age ans, vous êtes vieux."
elif ((i>100 && i<120)); then
echo "Vous avez plus de 100 ans, incroyable !"
elif ((i>120)); then
echo "Vous ne pouvez pas avoir plus de 120 ans."
else
echo "Données incorrectes" >&2
exit 1
fi
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#29 Le 01/07/2020, à 21:44
- Watael
Re : Script Bash
- vu qu'une partie du test est la même, on peut en faire une fonction.
- i=age n'est pas utile.
j'aurais tendance à ne pas aller plus loin tant qu'une donnée n'est pas entrée correctement :
until conditionsJourNaissance #une fonction pour faire propre*
do
read -r 'Entrez le jour de naissance (ou Ctrl-C pour arrêter le script) : ' jourNaissance
done
pour l'affichage aussi, plutôt une fonction acceptant un paramètre, et qui quitte le script :
((age<=30)) && affichage jeune
((30 < age && age <60)) && affichage age
#...
il y aurait un truc horrible (mais que j'adore), c'est l'opérateur ternaire :
(( condition : vrai ? faux ))
on peut les enchaîner dans "une seule" évaluation arithmétique :
mentions=( jeune age vieux ...)
((age<=30 : mention=0 ?
30<age && age<60 : mention=1 ?
...))
affichage "${mentions[mention]}"
*soit plusieurs fonctions (une par saisie), soit une seule acceptant un paramètre pour indiquer quelle partie exécuter
Dernière modification par Watael (Le 02/07/2020, à 14:51)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#30 Le 02/07/2020, à 07:11
- marcus68
Re : Script Bash
bonjour,
@sputnik je me permets de commenter votre code (en plus des remarques pertinentes de Watael),
#!/bin/bash
#VARIABLE DATE DU JOUR
read jourActu moisActu anneeActu < <(date +'%d %m %Y')
#INSERTION DATE DE NAISSANCE
read -p 'Entrez votre jour de naissance :' jourNaissance
read -p 'Entrez votre mois de naissance :' moisNaissance
read -p 'Entrez votre année de naissance :' anneeNaissance
# TEST VARIABLES
if [[ $jourNaissance =~ ^[0-9]{1,2}$ ]] \
&& ((jourNaissance >=1 && jourNaissance <=31)) \
&& [[ $moisNaissance =~ ^[0-9]{1,2}$ ]] \
&& ((moisNaissance >=1 && moisNaissance <=12)) \
&& [[ $anneeNaissance =~ ^[0-9]{4}$ ]] \
&& ((anneeNaissance > 1900 && anneeNaissance < anneeActu)) \
&& ((moisActu < moisNaissance))
then
age=$((anneeActu-anneeNaissance-1))
else
if [[ $jourNaissance =~ ^[0-9]{1,2} ]] \
&& ((jourNaissance >=1 && $jourNaissance <=31)) \
&& [[ $moisNaissance =~ ^[0-9]{1,2}$ ]] \
&& ((moisNaissance >=1 && moisNaissance <=12)) \
&& [[ $anneeNaissance =~ ^[0-9]{4}$ ]] \
&& ((anneeNaissance > 1900 && anneeNaissance < anneeActu)) \
&& ((moisActu > moisNaissance))
then
age=$((anneeActu-anneeNaissance))
else
echo "Données incorrectes">&2
fi
fi
i=$age
if ((i<=30)); then
echo "Vous avez $age ans, vous êtes jeune."
elif ((i>30 && i<60)); then
echo "Vous avez $age ans."
elif ((i>=60 && i<=100)); then
echo "Vous avez $age ans, vous êtes vieux."
elif ((i>100 && i<120)); then
echo "Vous avez plus de 100 ans, incroyable !"
elif ((i>120)); then
echo "Vous ne pouvez pas avoir plus de 120 ans."
else
echo "Données incorrectes" >&2
exit 1
fi
- cela ne tient pas compte de la longueur des mois, il n'y a pas 31 jours dans tout les mois. (on peut renseigner le 31 février par exemple)
- cela ne marche pas si la personne est née durant le début de l'année en cours (cela produit une erreur)
- si la personne a moins qu'un an, il faut peut-être adapter l'affichage
- la condition ((i>120)) est impossible à réaliser, la date la plus petite renseignable est 1 janvier 1901
- il manque un "exit 1" après le premier "Données incorrectes", sinon il va tenter de faire un calcul sur des données incorrects
- à quoi peut bien servir le deuxième "Données incorrectes" ?
Cordialement
Dernière modification par marcus68 (Le 02/07/2020, à 07:13)
Hors ligne
#31 Le 12/07/2020, à 15:52
- LeoMajor
Re : Script Bash
bonjour,
oui bien vu. année bissextile aussi.
il y a un problème de sémantique sur la date de naissance .
Vous ne vérifiez pas que la date est vraiment une date ( +1 pingouinux #27)
Hors ligne
#32 Le 12/07/2020, à 16:15
- MicP
Re : Script Bash
Bonjour
Pour pouvoir contrôler la saisie d'une date,
il faudrait faire d'abord entrer l'année, ce qui permettrait de savoir si elle est bissextile ou pas,
puis le mois, et enfin le jour du mois qui serait alors limité au nombre de jours possibles en fonction du mois et de l'année.
Les calculs permettant de déterminer l'âge et tester les conditions
pourraient se faire en utilisant de simples comparaisons et soustractions directement avec la commande date
Dernière modification par MicP (Le 17/07/2020, à 20:40)
Hors ligne