Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

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.

#1 Le 15/03/2017, à 18:56

akhetos

Debutant, enlever certains messages d'erreurs

Bonjour,

totalement novice en programation, je dois rendre un travail pour les cours ou l'objectif de l'exercice est d'écrire un script renvoyant le nombre max parmis une liste d'entier.
Voici mon script:

!/bin/bash
# Retourne le plus grand entier


function isnum ()
#fonction qui renvoie 0 (vrai) quand l'argument qui lui est passé en paramètre est un nombre (positif ou négatif), 1 sinon
{
   if [[ "$1" =~ ^[-+]?[0-9]+$ ]]; then
      return 0
   else
      return 1
   fi
}

function aide ()
# affiche l'aide de la commande (si $1 = "-h"
{
    echo "usage : Maximum v1 v2 ... vn"
    echo "verifie que chaque parametre est un entier"
    echo "affiche le maximum si il y au moins un entier dans les parametre"
    echo "affiche un message d'erreur si il n'y a aucun entier (sur sortie erreur)"
    return 0
}

if [ $# -eq 0 ]; then #si l'utilisateur n'a rentrer aucun parametre message d'erreur
   echo "pas de parametre !" >&2
   aide
elif [ $1 = "-h" ]; then #affiche l'aide si on lance le script avec -h en argument
   aide
else


for i in $@  #on va checker tous les parametre passer par l'utilisateur
    do
    if isnum $i  #on verifie si la i eme varible est une chiffre ou pas, si ca l'est alors
        then
        
        max=$1  #on initialise max avec le premier chiffre rentrer par l'utilisteur ICI QUE CA BUG
        
        if [ $max -lt $i ]; then #on comparer la i em variable avec max, si max est inférieur alors max prend la valeur de la i eme variable
        max=$i


        fi

    fi

done


    if isnum $max; then echo $max  #si $max existe alors on affiche le plus grand chiffre
    else
        echo "mettez au moins un chiffre entier" >&2 #si il n'y a aucun chiffre entier alors message d'erreur
        aide

    fi
fi

Si je met un mot par exemple a la place d'un entier comme premier paramètre rentrer par l'utilisateur alors mon programme ne marche plus..

y a t il un moyen pour définir $max comme le premier entier rentrer par l'utilisateur? Si je met max=$i alors mon programme me renverra le dernier entier rentrer par l'utilisateur...

Dans l’idéal j'aimerais, dès que $max est créer, ne plus y toucher et uniquement le comparer aux autres paramètre rentrer par l'utilisateur
un truc du genre:
max=$i puis ne plus effectuer cette instruction si elle a déjà été exécutée une fois

Est il possible de faire ça?

ps: je pense que mon code n'est absolument pas optimiser, si vous souhaitez me donner des pistes pour l'améliorer n'hésitez pas, je cherche cependant a apprendre par moi même donc merci de ne pas me donner de solution toute prête big_smile

Merci

Hors ligne

#2 Le 15/03/2017, à 20:13

Watael

Re : Debutant, enlever certains messages d'erreurs

salut,

i n'est pas le i ème paramètre du script, c'est un argument parmi la liste des arguments.

pourquoi max devrait-il valoir $1 ?
il faut déterminer si max existe, sinon lui sera assigné le premier élément de la liste des arguments en cours d'itération.


eval, c'est mal.

Hors ligne

#3 Le 15/03/2017, à 21:08

Watael

Re : Debutant, enlever certains messages d'erreurs

$max n'existe pas lorsque for boucle sur le premier argument.

$ unset max
$ set -- $RANDOM $RANDOM $RANDOM $RANDOM
$ echo "$@"
4859 16270 11450 4761
$ for i do test -z "$max" && max=$i || if test $i -gt $max; then max=$i; fi; done; echo $max
16270

Dernière modification par Watael (Le 15/03/2017, à 21:17)


eval, c'est mal.

Hors ligne

#4 Le 15/03/2017, à 21:08

akhetos

Re : Debutant, enlever certains messages d'erreurs

Effectivement merci pour le "i n'est pas le i ème paramètre du script, c'est un argument parmi la liste des arguments." je mettais mal exprimer dans mes commentaire mais effectivement j'avais mal compris comment fonctionnais cette partie du programme.

Merci beaucoup, je tentes de coder ca demain mais je pense savoir comment faire du coup

Hors ligne

#5 Le 15/03/2017, à 21:19

Watael

Re : Debutant, enlever certains messages d'erreurs

mieux! : on pourrait assigner le premier paramètre du script à max avant de démarrer la boucle. ça éviterait de faire le test à chaque tour de boucle !


eval, c'est mal.

Hors ligne

#6 Le 15/03/2017, à 21:22

akhetos

Re : Debutant, enlever certains messages d'erreurs

Le problème c'est que si on fais ca et que le premier parametre est un String par exemple on ne peux plus comparer

if [ $max -lt $i ] ne marche plus

Hors ligne

#7 Le 15/03/2017, à 22:01

Watael

Re : Debutant, enlever certains messages d'erreurs

until isnum $1; do shift; done
max=$1
for...

eval, c'est mal.

Hors ligne

#8 Le 18/03/2017, à 12:17

akhetos

Re : Debutant, enlever certains messages d'erreurs

Merci beaucoup!

Hors ligne