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
    Futur Membre du Club
    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.

  2. #2
    Expert éminent sénior
    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.

  3. #3
    Expert éminent sénior
    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.

  4. #4
    Nouveau membre du Club
    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 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    date --help

    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 :-)

  5. #5
    Expert éminent sénior
    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.

  6. #6
    Modérateur

    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...
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  7. #7
    Nouveau membre du Club
    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//-/ }

  8. #8
    Expert éminent
    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.

  9. #9
    Futur Membre du Club
    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

  10. #10
    Futur Membre du Club
    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

  11. #11
    Modérateur

    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).
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  12. #12
    Expert éminent sénior
    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.

  13. #13
    Futur Membre du Club
    Par contre j'ai un souci niveau "compatibilité". Je m'explique :
    La commande marche nickel sous mon linux ou celui de mon collègue, mais dès que je test sur la VM (là où sera évalué la commande), il y a juste la première ligne qui est lu alors qu'elle devrait lire toutes les lignes du .txt. Je ne comprends pas...
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #Programme principal
    if [ $# -ne 1 ]; then
    	aide
     
    elif [ $# -eq 1 ]; then
     
    donnee=`cut -d ":" -f1,2,3 $1 | sed 's/:/ /g'`	# Etape 1 et 2
    while read line # La boucle while va permettre de lire le fichier ligne par ligne
    do
        ./affichersigne $line
    done <<< $donnee

  14. #14
    Modérateur



    on a un échantillon représentatif du fichier à traiter ?

    a priori :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while IFS=':' read champ1 champ2 champ3 reste
    do
        : ce que tu veux avec "$champ1" "$champ...
    done < "$fichier"
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  15. #15
    Futur Membre du Club
    Oui, le fichier .txt se présente de la sorte (voir le code) Je ne comprends pas pourquoi sur la VM il ne lit que la première ligne alors que sur mon PC il lit toutes les lignes....

    fichier .txt
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Galle:Martin:12-2-1989:rue du casino:Uriage-les-Bains:38000
    Goudy<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />ebby:14-9-1990:avenue des cheveux raides<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />aris:75002
    Pleur:Jean:13-3-1994:rue de la poisse:Grenoble:38000
    Prane<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />olly:19-11-1995: place de la pharmacie:Grenoble:38100
    Mieu:Jeff-Edmond:22-12-1992:sentier des efforts:Grenoble:38000
    Honnete:Marie:24-10-1982:boulevard Guignol<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />aris:75003

  16. #16
    Modérateur

    tu peux nous en dire plus sur ces machines physiques et virtuelles ? OS, shell...
    mais de toute façon il ne faut pas utiliser ton script : on ne devrait pas pouvoir lire une variable ligne par ligne quand elle n'est pas entre guillemets, bien que certains shells, il semble me souvenir, le permettent.
    fais comme j'ai montré.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  17. #17
    Futur Membre du Club
    La VM fait tourner un ubuntu 16.04.2

  18. #18
    Modérateur

    un petit coup dans mes a priori :
    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ maVar='foo
    bar 
    baz'
    $ while read line; do echo ">$line<"; done <<<$maVar 
    >foo<
    >bar<
    >baz<
    bon, le here-string est bien passé ligne par ligne.

    <mauvaise foi style="un peu">
    ça n'empêche pas que c'est pas beau, et inutile.
    </mauvaise foi>


    La VM fait tourner un ubuntu 16.04.2
    et les shells ?
    et l'OS sur la machine physique ?
    et, comment lances-tu le script sur l'une et l'autre de tes machines ?
    et, ...
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  19. #19
    Membre éclairé
    Ça doit être depuis bash 4.4 : https://github.com/bminor/bash/blob/...4/CHANGES#L437
    Bash no longer splits the expansion of here-strings, as the documentation has always said.
    Or sous ubuntu 16.04, bash semble être au plus en 4.3 : https://packages.ubuntu.com/xenial-updates/bash

  20. #20
    Futur Membre du Club
    bash version 4.3.48
    et je testais les commandes sous windows avec gitbash.

###raw>template_hook.ano_emploi###