Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

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 30/06/2020, à 16: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, à 17: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é ?

Hors ligne

#3 Le 30/06/2020, à 18: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, à 18: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, à 19:01

sputnick

Re : Script Bash

Tomy-Gunn a écrit :

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.

Hors ligne

#6 Le 01/07/2020, à 10: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, à 11: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, à 11: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, à 12:00)

Hors ligne

#9 Le 01/07/2020, à 12: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, à 12:57)

Hors ligne

#10 Le 01/07/2020, à 12: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.

Hors ligne

#11 Le 01/07/2020, à 13: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, à 13: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, à 13:09)

Hors ligne

#13 Le 01/07/2020, à 13: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, à 13:23

Watael

Re : Script Bash

et si je veux calculer l'âge qu'aurait Napoléon Bonaparte ?


Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 01/07/2020, à 13: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, à 13: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, à 13:43)

Hors ligne

#17 Le 01/07/2020, à 14:18

nany

Re : Script Bash

Bonjour,



Tomy-Gunn a écrit :

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".


Le mot de passe sudo ne s'affiche pas
Comment bien utiliser les balises BBcode
LIBRARIES ARE NOT BOOK-STORES! − Une souris, des souris. Un souci, des soucis. Une énigme résolue, un problème résolu.
J’ai forké le compteur-couche-tard.

En ligne

#18 Le 01/07/2020, à 14:20

sputnick

Re : Script Bash

Pauvre Tommy-Gun.

Quand on débute, on utilise des choses lisibles et simples smile

Hors ligne

#19 Le 01/07/2020, à 14: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, à 15: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.


Welcome to sHell. · eval is evil.

Hors ligne

#21 Le 01/07/2020, à 17: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, à 17:18

pingouinux

Re : Script Bash

Tomy-Gunn #21 a écrit :

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, à 17:46)

Hors ligne

#23 Le 01/07/2020, à 17:51

Watael

Re : Script Bash

on convertit en base 10 :

mois=08
mois=$((10#$mois))

edit: grilled! smile

Dernière modification par Watael (Le 01/07/2020, à 17:51)


Welcome to sHell. · eval is evil.

Hors ligne

#24 Le 01/07/2020, à 18: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, à 18:29

nany

Re : Script Bash

nany a écrit :

J’ajouterais aussi un exit après echo "Données incorrectes".


Le mot de passe sudo ne s'affiche pas
Comment bien utiliser les balises BBcode
LIBRARIES ARE NOT BOOK-STORES! − Une souris, des souris. Un souci, des soucis. Une énigme résolue, un problème résolu.
J’ai forké le compteur-couche-tard.

En ligne