IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Linux Discussion :

script: Fact !


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut script: Fact !
    Bonjour!

    Juste une petite question, peut être vous la trouverez bête mais je suis encore débutante dans tout ce qui concerne "Unix"

    je n'ai pas compris cette écriture {n:-1}
    je vous donne un exemple d'utilisation " Script shell qui calcule la factorielle d'un nombre entré en argument "

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    
    n=$1
    while [ $n -gt 1 ]
    do
    f=$(( $n*${f:-1} ))
    n=$(( $n - 1 ))
    done
    
    echo "$n"

    Une autre question, le code en haut c'est un simple script, j'ai essayé d'écrire un script qui fait le même travail (calcule de la factorielle) mais en utilisant un script récursive .. j'ai bien essayé mais ça ne marche pas!!

    Pouvez-vous m'aider ?? svp

    là je suis entrain de préparer l'examen final, et j'ai un nombre d'exercices/problèmes et j'essaye de les résoudre .. je ne pose pas la question et je ne demande pas de l'aide si j'ai jamais essayé moi seul

    Merci d'avance & bien cordialement

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    http://www.developpez.net/forums/d71...ouver-lerreur/


    içi j'ai trouvé " factorielle récursive " .. mais je n'i rien compris car on n'utilise pas encore TEST ...

  3. #3
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Retourne la valeur de f si f est non vide ou non-initialisé
    écriture équivalente de x=${f:-1} :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ -z "$f" ]
    then  x=1
    else  x=$f
    fi
    Montre nous ton script qui ne marche pas, et dis nous ce qui ne marche pas.
    Si tu lance ton script avec sh -x chemin_et_nom_du_script il t'affiche toutes les opérations effectuées, c'est pratique pour déboguer.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Bonsoir,

    Merci très bien pour l'explication et je pense que la deuxième écriture est plus compréhensible que l'autre ..

    Concernant ma deuxième question, Script récursif :

    j'ai essayé un qui ne marche pas, çi-joint sa capture d'écran (avec des commentaires)

    Merci encore une fois
    Images attachées Images attachées  

  5. #5
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Un qui marche (avec bash) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    (($1>20)) && echo "Ne peut traiter des nombres supérieurs à 20"
    if (($1>1))
    then
    	echo "$(( $1 * $(./fact $(($1-1)) ) ))"
    else
    	echo "$1"
    fi
    les script doit être enregistré sous le nom fact et appelé depuis le répertoire où il se trouve :

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 685
    Par défaut
    Je ne sais pas, j'utiliserais une fonction plutôt que de rappeler le script :
    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
    #!/bin/bash
     
    function factFunc
    {
       local a=$1
       if (( $a > 1 )); then
          echo "$(( $a * $(factFunc $(($a-1)) ) ))"
       else
          echo "$a"
       fi
    }
     
    if (( $1 > 20 )); then
       echo "Ne peut traiter des nombres supérieurs à 20"
       exit 1
    else
       factFunc $1
    fi
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Bonjour tout le monde,

    // Fransoo //

    Je te remercie, et concernant "bash", je pense que ça marche aussi avec "sh" .. non ?! moi j'utilise toujours le script sh, une fois j'ai utiliser la commande qui nous permet d'avoir le nom de script à utiliser ( je l'ai oublié xD ) et elle m'a affiché "bash" .. bon à ce moment on n'utilise que "sh" alors j'ai une petite question de plus ^^ : quelle est la différence entre bash et sh ??!! ( juste entre ces deux car il y en a plusieurs ).

    Merci très bien,

    // N_BaH //

    Je pense que l'utilisation d'une fonction est plus mieux car elle rassemble aux fonctions en langage C ^^
    mais dommage on n'a pas encore entamé la partie des fonction dans les scripts, donc je garde ta solution mais je ne peux plus l'utiliser lors d'un examen.. en tout cas Merci bien

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Re Bonjour ^^

    Bon, j'ai bien vue la différence entre l'écriture des deux (sh et bash)
    j'ai copier ton script mais j'ai utiliser sh et j'ai changé tout ce qu'il faut le changer et ça marche bien,
    voilà la portion du script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
     
    #Nom du script est "facto"
     
    if [ $1 -gt 1 ]; then
    fact=$(( $1*$(./facto $(( $1 - 1 ))) ))
    echo "$fact"
    else 
    echo "$1"
    fi

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xymahis Voir le message
    Bonjour tout le monde,

    // Fransoo //

    Je te remercie, et concernant "bash", je pense que ça marche aussi avec "sh" .. non ?! moi j'utilise toujours le script sh, une fois j'ai utiliser la commande qui nous permet d'avoir le nom de script à utiliser ( je l'ai oublié xD ) et elle m'a affiché "bash" .. bon à ce moment on n'utilise que "sh" alors j'ai une petite question de plus ^^ : quelle est la différence entre bash et sh ??!! ( juste entre ces deux car il y en a plusieurs ).
    Le sh est le shell d'origine. Il a été écrit en 1968 par Steve Bourne et avait juste pour but d'interpréter les commandes et les exécuter.
    Puis d'autres shells sont apparus, avec des possibilités intéressantes, comme le ksh qui permettait le rappel des commandes et le prompt qui varie en fonction du répertoire.

    Quand Linux est sorti, Steve Bourne en a profité pour reprendre les trucs chouettes des autres shells et les a regroupés dans un nouveau shell => le Bourne Again Shell => bash
    Un script écrit en sh fonctionnera en bash. Inversement, un script bash ne fonctionnera pas forcément en sh (notamment s'il utilise des outils avancés du bash).

    D'ailleurs si t'es sous Linux, tu peux aller jeter un oeuil sur le fichier /bin/sh. Tu verras qu'il s'agit d'un lien vers /bin/bash => ainsi quand tu crois travailler en shell, ben en fait tu travailles en bash ce qui n'est pas grave puisque le sh est 100% compatible bash.

    Tutoriels Shell Linux : http://linux.developpez.com/cours/

    Citation Envoyé par xymahis Voir le message
    j'ai copier ton script mais j'ai utiliser sh ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
    
    #Nom du script est "facto"
    
    if [ $1 -gt 1 ]; then
    fact=$(( $1*$(./facto $(( $1 - 1 ))) ))
    echo "$fact"
    else 
    echo "$1"
    fi
    Ben justement non, l'instruction en rouge est une instruction spécifique bash. Le shell, lui, ne sait pas faire d'opération mathématique. Il est obligé de passer par un programme externe comme bc ou expr...

    Voici un script pur sh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/sh
     
    #Nom du script est "facto"
     
    if [ $1 -gt 1 ]; then
    new=`expr $1 - 1`
    expr $1 \* `$0 $new`
    else 
    echo "$1"
    fi
    En plus, en utilisant $0 au lieu de "./facto" ben le script peut se nommer comme on veut, ça ne change rien...

    Citation Envoyé par xymahis Voir le message
    Je pense que l'utilisation d'une fonction est plus mieux car elle rassemble aux fonctions en langage C ^^
    Effectivement. Vaut mieux, surtout si c'est du récursif, utiliser une fonction où tout l'appel récursif ne sera géré que par le seul processus qui fait tourner le script plutôt qu'un script qui s'appelle lui-même et donc où chaque appel va générer la création d'un nouveau processus.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 685
    Par défaut
    Quand Linux est sorti, Steve Bourne en a profité pour reprendre les trucs chouettes des autres shells et les a regroupés dans un nouveau shell => le Bourne Again Shell => bash
    non, non : Brian Fox et Chet Ramey
    man bash /AUTEURS
    wikipedia
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre à l'essai
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben justement non, l'instruction en rouge est une instruction spécifique bash. Le shell, lui, ne sait pas faire d'opération mathématique. Il est obligé de passer par un programme externe comme bc ou expr...
    même s'il s'exécute bien il faut -pour un script sh- utiliser expr ... pour les opérations ???

    appart ça, Merci infiniment pour l'explication

    MERCI +++++

  12. #12
    Membre expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Par défaut
    Que si tu n'as pas de shell évolué tel que bash. Sinon, la construction en double parenthèses suffit : http://abs.traduc.org/abs-fr/ch09s07.html.
    D'ailleurs, depuis mes débuts en shell et encore maintenant je me réfère souvent à ça : http://abs.traduc.org/.

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xymahis Voir le message
    même s'il s'exécute bien il faut -pour un script sh- utiliser expr ... pour les opérations ???
    Il l'exécute bien sur ton Linux car même si tu demandes /bin/sh, il passe quand-même par du bash.
    Mais si tu mettais ce script sur un vrai vieux Unix qui n'a que /bin/sh, il planterait là où c'est en rouge.
    Comme je l'ai dit, le Bourne Shell ne sait pas faire grand chose. Dès que t'as besoin d'un traitement particulier, il faut appeler un programme externe dédié au traitement (comme expr pour les calculs)

    Mon tuto t'expliquera ça en 3° partie (les compléments)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  2. Script et XMLmodule
    Par Ph. B. dans le forum XMLRAD
    Réponses: 4
    Dernier message: 27/01/2003, 16h10
  3. quel langage choisir pour faire de script sous windows
    Par pas05 dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 18/11/2002, 22h42
  4. Réponses: 2
    Dernier message: 11/07/2002, 08h31

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