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.

#26 Le 01/07/2020, à 19: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, à 19: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, à 22: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

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#29 Le 01/07/2020, à 22: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, à 15:51)


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

Hors ligne

#30 Le 02/07/2020, à 08: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, à 08:13)

Hors ligne

#31 Le 12/07/2020, à 16: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, à 17: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, à 21:40)

Hors ligne