Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Commande débutant - BASH


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    novembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : novembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Commande débutant - BASH
    Bonjour à toutes et à tous,

    Je suis un étudiant, je débute sous bash. Langage qui est difficile à appréhender, c'est pour ça que je me tourne vers vous. Il est question ici d'écrire une commande qui affiche le signe du zodiaque d'une personne donnée avec pour paramètres prénom, nom, date de naissance.
    Ex: ./Signepersonne Albert Crayon 07-03-1970
    Ce qui doit renvoyer par exemple : Albert Crayon est né le 07/03 et est de signe Poisson.

    J'ai écris un script qui permet de déterminer le signe du zodiaque en général, comment utiliser cette commande pour déterminer le signe du zodiaque de la personne qui a entrée les paramètres ?
    Je me permets de vous faire voir ce que j'ai fait pour déterminer le signe. Je n'ai pas utilisé les tableaux car ils n'ont pas été abordés en cours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     Programme principal
    if [ $# -eq 0 ]; then 
    	echo "pas de parametre !" >&2
    	aide
     
    elif [ $1 = "--help" ]; then
    	aide
     
     
    elif [ $# -ne 2 ];then
    echo "Merci de saisir deux parametres qui sont des entiers si besoin faire signezodiaque --help" 
     
     
    elif [ $2 -eq 12 ] && [ $1 -ge 22 ] && [ $1 -le 31 ] || [ $2 -eq 01 ] && [ $1 -ge 1 ] && [ $1 -le 20 ]; then
    	echo "Capricorne"
     
    	elif [ $2 -eq 01 ] && [ $1 -ge 21 ] && [ $1 -le 31 ] || [ $2 -eq 02 ] && [ $1 -ge 1 ] && [ $1 -le 19 ]; then
    	echo "Verseau"
     
    elif [ $2 -eq 02 ] && [ $1 -ge 20 ] && [ $1 -le 29 ] || [ $2 -eq 03 ] && [ $1 -ge 1 ] && [ $1 -le 20 ]; then
    	echo "Poissons"
     
    elif [ $2 -eq 03 ] && [ $1 -ge 21 ] && [ $1 -le 31 ] || [ $2 -eq 04 ] && [ $1 -ge 1 ] && [ $1 -le 20 ]; then
    	echo "Belier"
     
    elif [ $2 -eq 04 ] && [ $1 -ge 21 ] && [ $1 -le 30 ] || [ $2 -eq 05 ] && [ $1 -ge 1 ] && [ $1 -le 21 ]; then
    	echo "Taureau"
     
    elif [ $2 -eq 05 ] && [ $1 -ge 22 ] && [ $1 -le 31 ] || [ $2 -eq 06 ] && [ $1 -ge 1 ] && [ $1 -le 21 ]; then
    	echo "Gemeaux"
     
    elif [ $2 -eq 06 ] && [ $1 -ge 22 ] && [ $1 -le 30 ] || [ $2 -eq 07 ] && [ $1 -ge 1 ] && [ $1 -le 22 ]; then
    	echo "Cancer"
     
    elif [ $2 -eq 07 ] && [ $1 -ge 23 ] && [ $1 -le 31 ] || [ $2 -eq 08 ] && [ $1 -ge 1 ] && [ $1 -le 23 ]; then
    	echo "Lion"	
     
    elif [ $2 -eq 08 ] && [ $1 -ge 24 ] && [ $1 -le 31 ] || [ $2 -eq 09 ] && [ $1 -ge 1 ] && [ $1 -le 23 ]; then
    	echo "Vierge"	
     
    elif [ $2 -eq 09 ] && [ $1 -ge 24 ] && [ $1 -le 30 ] || [ $2 -eq 10 ] && [ $1 -ge 1 ] && [ $1 -le 23 ]; then
    	echo "Balance"	
     
    elif [ $2 -eq 10 ] && [ $1 -ge 24 ] && [ $1 -le 31 ] || [ $2 -eq 11 ] && [ $1 -ge 1 ] && [ $1 -le 22 ]; then
    	echo "Scorpion"
     
    elif [ $2 -eq 11 ] && [ $1 -ge 23 ] && [ $1 -le 30 ] || [ $2 -eq 12 ] && [ $1 -ge 1 ] && [ $1 -le 21 ]; then
    	echo "Sagittaire"
     
    fi
    Merci d'avance.
      0  0

  2. #2
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 001
    Points : 9 826
    Points
    9 826
    Par défaut
    Bonjour

    Citation Envoyé par azier Voir le message
    Ex: ./Signepersonne Albert Crayon 07-03-1970

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    elif [ $# -ne 2 ];then
    echo "Merci de saisir deux parametres qui sont des entiers si besoin faire signezodiaque --help"
    2 incohérences :
    • signezodiaque ? Ou ./Signepersonne ?
    • Combien de paramètres dans ton exemple ? Combien de paramètres dans ton programme ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
      1  0

  3. #3
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 269
    Points : 9 371
    Points
    9 371
    Par défaut
    Bonjour et Bienvenue,

    Est-ce que ça fonctionne ?

    Tu peux simplifier tes comparaisons en faisant par exemple [ $2$1 -ge 1222 ] && [ $2$1 -le 1231 ] || [ $2$1 -ge 101 ] && [ $2$1 -le 120 ].
    Cordialement.
      0  0

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur généraliste
    Inscrit en
    juin 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur généraliste
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2015
    Messages : 42
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    ./Signepersonne Albert Crayon 07-03-1970
    Tout pareil !!
    Pour moi ça fait 3 paramètres ça !
    Ensuite, si ta date est écrite de cette façon "07-03-1970", ne faudra-t-il pas que tu sépare les " parties " individuellement ?
    ça va être compliqué ça non ? Il va falloir faire des "cut" ou je sais pas quoi ?? !! non ??

    Pour moi le plus simple c'est de faire rentrer les paramètres sous la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./Signepersonne 07 03 1970
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./Signepersonne 07/03/1970
    ... c'est pareil ...

    Ensuite ... très très important, il va falloir que tu dises à ta ou ton prof que tu as utilisé le man de "date" !!!

    parce que, si tu utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     date --date='11/13/99' +%j
    ça te retourne le jour de l'année.
    Ici, 317 !
    ça marche aussi comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     date --date='11/13/1999' +%j
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     date --date='6/20/2007' +%j
    /!\ fait attention, le format semble être américain, mois/jours/année.
    mais si tu fais :
    peut-être que tu peux trouver pour mettre le format jours/mois/année

    Ensuite quand tu as le jours, les tests sont quand même beaucoup plus simple, il me semble...
    Pour récupérer. ça ne te fais plus que des comparaison entre 1 et 365.

    pour récupérer le jour, la commande doit-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jour=$(date --date='11/13/99' +%j)
    echo $jour
    317
    du coup tu peu faire ta comparaison sur $jour.

    Allés! Amuses toi bien :-)
      0  0

  5. #5
    Expert éminent Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 269
    Points : 9 371
    Points
    9 371
    Par défaut
    Un petit exemple de gestion de paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $ cat /tmp/bob.sh 
    #!/bin/bash
    echo "Nb param: $#"
    OLDIFS="$IFS"
    IFS="-"
    set $@
    IFS="$OLDIFS"
    echo "Nb param: $#"
    echo "IFS: $IFS"
    n=0
    for i in $@
    do
    	((n++))
    	echo "Param n°$n: $i"
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ /tmp/bob.sh Albert Crayon 07-03-1970
    Nb param: 3
    Nb param: 5
    IFS:  	
     
    Param n°1: Albert
    Param n°2: Crayon
    Param n°3: 07
    Param n°4: 03
    Param n°5: 1970
    Cordialement.
      2  0

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    5 771
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 5 771
    Points : 15 130
    Points
    15 130
    Par défaut
    vivement que le frère de M. Crayon soit nommé Jean-Marc !
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    IFS='-' read jour mois annee <<<"$3" #où le troisième paramètre est 09-11-2019, par exemple
    ou
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    read jour mois annee <<<${3//-/ }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    jour=${3::2}
    mois=${3:3:2}
    ou...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.
      2  0

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur généraliste
    Inscrit en
    juin 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur généraliste
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2015
    Messages : 42
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    [...]
    OLDIFS="$IFS"
    IFS="-"
    IFS="$OLDIFS"
    Citation Envoyé par N_BaH Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IFS='-' read jour mois annee <<<"$3"
    [...]
    read jour mois annee <<<${3//-/ }
    [...]
    jour=${3::2}
    mois=${3:3:2}
    Hein ???
    J'espère que @azier ne sera pas perdu !
    En tout cas moi je suis sous l'eau !
    j'ai voulu faire le malin avec ma "date" mais vous m'avez noyé avec vos "IFS" (Indice Fin Section?) vos 3riples "<<<" et les ${3::3} et autre ${3//-/ }
      0  0

  8. #8
    Expert éminent

    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 894
    Points : 6 072
    Points
    6 072
    Par défaut
    Salut,

    Citation Envoyé par Wire.Less Voir le message
    j'ai voulu faire le malin avec ma "date" mais vous m'avez noyé avec vos "IFS" (Indice Fin Section?)
    man -P 'less -p "^ +IFS "' bash et c'est valable pour toutes les sections du man bash
    $ man woman
    Il n'y a pas de page de manuel pour woman.
      2  0

  9. #9
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    novembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : novembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonsoir,

    Pour le coup, je me suis débrouillé comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    jourMois=(`sed 's/-/ /g' <<< $3 | cut -d " " -f 1,2`) 
    signe=`./signezodiaque ${jourMois[*]}`
    echo $1 $2 est né\(e\) un ${jourMois[0]}/${jourMois[1]} et a pour signe zodiacal $signe
    # Etape 1 : Commande sed "s/-/ /g". Sortie : remplace les - par des espace sur le 3eme parametre qui est par exemple 14-04-1970. Ce qui donne : 14 4 1970
    # Etape 2 : cut -d " " -f 1,2 . Sortie : Recupere le 1er et 2eme champs. Dans notre exemple 14 4
    Puis on utilise la commande signezodiaque qui va nous déterminer le signe d'Albert Crayon


    Merci à vous en tout cas
      0  0

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Lycéen
    Inscrit en
    novembre 2019
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : novembre 2019
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour et Bienvenue,

    Est-ce que ça fonctionne ?

    Tu peux simplifier tes comparaisons en faisant par exemple [ $2$1 -ge 1222 ] && [ $2$1 -le 1231 ] || [ $2$1 -ge 101 ] && [ $2$1 -le 120 ].
    J'ai essayé ça ne me retourne pas capricorne si je tape 22 à 31 12 par exemple
      0  0

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    5 771
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 5 771
    Points : 15 130
    Points
    15 130
    Par défaut
    comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [[ $m$j -ge 321 && $m$j -le 331 ]] || [[  $m$j -ge 401 && $m$j -le 420 ]]
    en s'assurant d'ajouter un zéro au début des jours ($j) composés d'un seul chiffre, ET d'enlever le zéro qui précéderait les mois ($m).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.
      1  0

  12. #12
    Expert éminent Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 001
    Points : 9 826
    Points
    9 826
    Par défaut
    Tout ça à cause de la maladresse de faire un cut après un sed, alors que les 3 opérations peuvent être faites avec un seul sed (supprimer les tirets, enlever l'année, enlever l'éventuel 0 du début).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
      0  0

Discussions similaires

  1. Réponses: 12
    Dernier message: 26/05/2018, 12h00
  2. commande shell bash
    Par achrafkaran dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 17/12/2011, 13h30
  3. Utiliser une commande de Bash 4.0 sous Bash 3.0
    Par Yokav dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 20/05/2011, 10h29
  4. commande sed (bash)
    Par bossy451 dans le forum Linux
    Réponses: 1
    Dernier message: 28/03/2010, 19h41
  5. [débutant] [BASH] problème script backup
    Par julien.63 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/04/2008, 19h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo