#1 Le 30/06/2020, à 15:31
- Tomy-Gunn
Script Bash
Bonjour à tous,
Je suis débutant sur Linux et je dois réaliser un script bash qui demande la date de naissance de l'utilisateur
(jour,mois et année) qui vérifie les données saisies et qui renvoie l'age selon
la date de naissance saisie.
Mes problèmes sont les suivants :
- La vérification des données saisies pour que l'utilisateur ne puisse saisir que
des nombres correspondant à ceux d'une date de naissance.
- Les calculs à éffectuer en fonction de la date saisie et de la date courante.
J'espere avoir été assez clair et que quelqu'un saura m'aider.
Merci d'avance.
Hors ligne
#2 Le 30/06/2020, à 16:35
- sputnick
Re : Script Bash
Salut,
tu suis des cours on dirait ?
On t'a pas donné des pistes ?
Que connaît tu pour faire ça ?
A tu cherché ?
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#3 Le 30/06/2020, à 17:10
- Tomy-Gunn
Re : Script Bash
Salut Sputnik
Oui je suis des cours, j'ai un fichier pour m'aider qui explique les bases mais je n'arrive pas à l'appliquer dans mon script.
Je n'arrive pas à limiter les données saisies par l'utilisateur (regex pour n'avoir que des chiffres et les conditions pour définir une plage de saisie) ni à faire les calcul en fonction de la date saisie (si elle est passée ou non) pour avoir le bon age.
J'ai cherché un peu partout sur beaucoup de forum...
Hors ligne
#4 Le 30/06/2020, à 17:20
- pingouinux
Re : Script Bash
Bonjour,
Regarde la commande date, qui permet de vérifier qu'une date est correcte, et de calculer le nombre de secondes séparant deux dates.
Hors ligne
#5 Le 30/06/2020, à 18:01
- sputnick
Re : Script Bash
Salut Sputnik
Je n'arrive pas à limiter les données saisies par l'utilisateur (regex pour n'avoir que des chiffres et les conditions pour définir une plage de saisie) ni à faire les calcul en fonction de la date saisie (si elle est passée ou non) pour avoir le bon age.J'ai cherché un peu partout sur beaucoup de forum...
Qu'a tu trouvé ?
Essaye quelque chose et si tu galère, poste ton code, on verra.
La c'est un peu vague.
Si on te fournit une solution, tu va rien apprendre, il faut chercher par toi même.
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#6 Le 01/07/2020, à 09:41
- Tomy-Gunn
Re : Script Bash
Salut.
Je sais que me donner la solution n'en est pas une, ce n'est pas ce que je recherche non plus.
J'aimerais juste avoir quelque indications sur la syntaxe et comment mettre en page le code.
Voilà en gros ce que j'essaye de faire. (Pour limiter les données saisies par l'utilisateur.)
#!/bin/bash
anneeactu=$(date +%Y)
read -p 'Entrez votre année de naissance :' anneenaissance
if sed -e [ ^[0-9]{4} $anneenaissance ] && [ $anneenaissance -ge 1900 ] && [$anneenaissance -lt $anneeactu ]
then
let "age=anneeactu-anneenaissance"
else
echo "Données incorrectes"
fi
echo "Vous avez $age ans."
Hors ligne
#7 Le 01/07/2020, à 10:05
- pingouinux
Re : Script Bash
#!/bin/bash
anneeactu=$(date +%Y)
read -p 'Entrez votre année de naissance :' anneenaissance
if grep -E ^[0-9]{4}$ <<<"$anneenaissance" && [ "$anneenaissance" -ge 1900 ] && [ "$anneenaissance" -lt "$anneeactu" ]
then
age=$((anneeactu-anneenaissance))
echo "Vous avez $age ans."
else
echo "Données incorrectes"
fi
Hors ligne
#8 Le 01/07/2020, à 10:58
- sputnick
Re : Script Bash
En bash moderne: (autant apprendre les bonnes bases des le début)
#!/bin/bash
anneeactu=$(date +%Y)
read -p 'Entrez votre année de naissance :' anneenaissance
if [[ $anneenaissance =~ ^[0-9]{4}$ ]] && ((anneenaissance > 1900 && anneenaissance < anneeactu)); then
age=$((anneeactu - anneenaissance))
echo "Vous avez $age ans."
else
echo "Données incorrectes" >&2
fi
Dernière modification par sputnick (Le 01/07/2020, à 11:00)
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#9 Le 01/07/2020, à 11:27
- MicP
Re : Script Bash
J'ai supprimé mon précédent message,
mais plutôt parce que l'expression rationnelle n'était pas correcte,
Je viens de la corriger :
#!/bin/bash
anneeactu=$(date +%Y)
read -p 'Entrez votre année de naissance : ' anneenaissance
if [[ $anneenaissance =~ (^(190[1-9]$|19[1-9][0-9]$)|^20[0-1][0-9]$) ]]; then
age=$((anneeactu - anneenaissance))
echo "Vous avez $age ans."
else
echo "Données incorrectes" >&2
fi
Dernière modification par MicP (Le 01/07/2020, à 11:57)
Hors ligne
#10 Le 01/07/2020, à 11:56
- sputnick
Re : Script Bash
C'est un peu trop avancé pour un débutant à mon avis.
En tout cas, Tomy-Gunn a le choix maintenant.
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#11 Le 01/07/2020, à 12:03
- MicP
Re : Script Bash
Oui, d'autant que moi aussi, je suis encore un débutant dans les expressions rationnelles
et donc, elle pourrait peut-être être mieux formulée.
Mais mon but était simplement de démontrer que parfois,
en une seule expression rationnelle on pouvait remplacer toute une série d'autre tests.
Hors ligne
#12 Le 01/07/2020, à 12:09
- sputnick
Re : Script Bash
Le souci, c'est que c'est difficile à lire, à moins d'utiliser Perl et les commentaires dans les regex avec le modifier 'x':
/
(/^(\U\S+\E) # foo
.*?at\s+ # bar
(\d{1,} # base
\.\d{2} # qux
[AP]M)/) # xxx
/x
Dernière modification par sputnick (Le 01/07/2020, à 12:09)
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#13 Le 01/07/2020, à 12:22
- Tomy-Gunn
Re : Script Bash
Merci pour votre aide !
Autre chose... après le calcul de l'age je dois proposer plusieurs réponse en fonction de l'age trouvé. Je voulais utiliser le test "case" mais je tombe toujours sur des erreurs de syntaxe.
Ou dois-je les mettre à la suite du test "if" ?
#!/bin/bash
anneeactu=$(date +%Y)
read -p 'Entrez votre année de naissance :' anneenaissance
if [[ $anneenaissance =~ ^[0-9]{4}$ ]] && (($anneenaissance > 1900 && $anneenaissance < $anneeactu)); then
age=$((anneeactu-anneenaissance))
else
echo "Données incorrectes"
fi
case "$age" in
[ -ge "30" ]) echo "Vous êtes jeune.";;
[ -gt "60" ] && [ -lt 100 ]) echo "Vous êtes vieux.";;
*) echo "Vous avez $age ans.";;
esac
Hors ligne
#14 Le 01/07/2020, à 12:23
- Watael
Re : Script Bash
et si je veux calculer l'âge qu'aurait Napoléon Bonaparte ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#15 Le 01/07/2020, à 12:37
- Tomy-Gunn
Re : Script Bash
Désolé il faut que l'utilisateur soit encore vivant.
Peut-être dans un prochain script...
Hors ligne
#16 Le 01/07/2020, à 12:41
- sputnick
Re : Script Bash
La syntaxe
(( ... ))
est beaucoup plus intuitive en bash (pas besoin d'utiliser -lt -gt):
pas de 'case' dans ce... cas:
i=21
if ((i<10)); then
echo "< 10"
elif ((i<20)); then
echo "< 20"
elif ((i<30)); then
echo "< 30"
else
echo "out of range"
fi
J'espère qu'on vous apprend pas à coder avec des vieilleries
Dernière modification par sputnick (Le 01/07/2020, à 12:43)
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#17 Le 01/07/2020, à 13:18
- nany
Re : Script Bash
Bonjour,
Je voulais utiliser le test "case" mais je tombe toujours sur des erreurs de syntaxe.
[…][…] case "$age" in [ -ge "30" ]) echo "Vous êtes jeune.";; [ -gt "60" ] && [ -lt 100 ]) echo "Vous êtes vieux.";; *) echo "Vous avez $age ans.";; esac
case "$age" in
[0-9]|[1-2][0-9]|30) echo "Vous êtes jeune.";;
6[1-9]|[7-9][0-9]) echo "Vous êtes vieux.";;
*) echo "Vous avez $age ans.";;
esac
J’ajouterais aussi un exit après echo "Données incorrectes".
Hors ligne
#18 Le 01/07/2020, à 13:20
- sputnick
Re : Script Bash
Pauvre Tommy-Gun.
Quand on débute, on utilise des choses lisibles et simples
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
https://sputnick.fr
Hors ligne
#19 Le 01/07/2020, à 13:50
- Tomy-Gunn
Re : Script Bash
C'est sur que quand je vois ta façon de faire, je me compliquais bien la tâche...
En tout cas merci beaucoup ! C'est déjà un peu plus claire.
Là je bloque sur les mois... De 01 à 07 :Données incorrectes.
08 et 09 : ((: 08 : valeur trop grande pour la base (le symbole erroné est "08")
10,11 et 12 me retourne le bon age
#!/bin/bash
#VARIABLE DATE DU JOUR
moisactu=$(date +%m)
anneeactu=$(date +%Y)
#INSERTION DATE DE NAISSANCE
read -p 'Entrez votre mois de naissance :' moisnaissance
read -p 'Entrez votre année de naissance :' anneenaissance
# TEST VARIABLES
if [[ $moisnaissance =~ ^[0-9]{2}$ ]] && (($moisnaissance >= 01 && $moisnaissance <=12)) && [[ $anneenaissance =~ ^[0-9]{4}$ ]] && (($anneenaissance > 1900 && $anneenaissance < $anneeactu)) && (($moisactu < $moisnaissance));then
age=$((anneeactu-anneenaissance-1))
else
if [[ $moisnaissance =~ ^[0-9]{2}$ ]] && (($moisnaissance >= 01 && $moisnaissance <= 12)) && [[ $anneenaissance =~ ^[0-9]{4}$ ]] && (($anneenaissance > 1900 && $anneenaissance < $anneeactu)) && (($moisactu > $anneenaissance));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>=60 && i<=100)); then
echo "Vous avez $age ans, vous êtes vieux."
else
echo "Vous avez $age ans."
fi
Hors ligne
#20 Le 01/07/2020, à 14:42
- Watael
Re : Script Bash
read moisActu anneeActu < <(date +'%m %Y')
et pour améliorer la lisibilité :
if [[ $moisNaissance =~ ^[0-9]{2}$ ]] \
&& (($moisNaissance >= 01 && $moisNaissance <=12)) \
&& [[ $anneeNaissance =~ ^[0-9]{4}$ ]] \
&& (($anneeNaissance > 1900 && $anneeNaissance < $anneeActu)) \
&& (($moisActu < $moisMaissance))
then
il est préférable d'éviter les longues lignes.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#21 Le 01/07/2020, à 16:11
- Tomy-Gunn
Re : Script Bash
C'est vrai que c'est plus lisible, merci.
Par contre toujours le problème avec les mois de 01 à 09.
Je comprends pas pourquoi il me met "données incorrectes" et "((: 08 : valeur trop grande pour la base (le symbole erroné est "08"))"
vu que le nombre est bien compris entre 01 et 12. Et que ça marche avec 10,11,12.
Hors ligne
#22 Le 01/07/2020, à 16:18
- pingouinux
Re : Script Bash
Je comprends pas pourquoi il me met "données incorrectes" et "((: 08 : valeur trop grande pour la base (le symbole erroné est "08"))"
Quand une chaîne débutant par un zéro est traitée comme un entier, bash considère que c'est de l'octal, et 8 n'est pas un chiffre octal.
Édité : Tu peux préciser la base (ici cest 10)
$ echo $((08))
bash: 08: value too great for base (error token is "08")
$ echo $((10#08))
8
Dernière modification par pingouinux (Le 01/07/2020, à 16:46)
Hors ligne
#23 Le 01/07/2020, à 16:51
- Watael
Re : Script Bash
on convertit en base 10 :
mois=08
mois=$((10#$mois))
edit: grilled!
Dernière modification par Watael (Le 01/07/2020, à 16:51)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#24 Le 01/07/2020, à 17:25
- Tomy-Gunn
Re : Script Bash
Merci pour l'info. J'ai préféré modifier la regex pour qu'elle prenne en compte qu'un chiffre (restons simple pour le moment...)
Encore une question ! est il possible d’arrêter le script à la fin du test "if" (ligne 37) si les données ne sont pas correctes ? (avant le i=$age)
Sinon ça me met : Données incorrectes.
Vous avez ans, vous êtes jeune.
#!/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"
fi
Hors ligne
#25 Le 01/07/2020, à 17:29
- nany
Re : Script Bash
J’ajouterais aussi un exit après echo "Données incorrectes".
Hors ligne