#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
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.
Connected \o/
Welcome to sHell. · eval is evil.
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)
Connected \o/
Welcome to sHell. · eval is evil.
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 !
Connected \o/
Welcome to sHell. · eval is evil.
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...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 18/03/2017, à 12:17
- akhetos
Re : Debutant, enlever certains messages d'erreurs
Merci beaucoup!
Hors ligne