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

Shell et commandes GNU Discussion :

shell et fonctions


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut shell et fonctions
    Bonjour,
    voila, en fait je débute en Shell et je rencontre quelques difficultés. Je vous explique mon problème : J'ai écrit un script shell test.sh, à lintérieur de ce script, j'appelle une fonction verif_val en lui transmettent comme paramètre un tableau de chaine de caractere. Pour chaque valeur de ce tableau, la fonction verif_val vérifie si la valeur est ègale à 18. Si c'est le cas, je voudrais pouvoir sortir de la fonction verif_val et reprendre la main dans mon script test.sh. Pour faire ça, j'ai mis un exit dans la fonction verif_val en cas d'erreur, le problème est que tout le shell s'arrête et que je n'ai plus la main.
    J'attends vos propositions pour une solution à ce problème. Merci d'avance.
    Vous trouverez ci-joint le script test.sh dans un fichier Word.

    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
    # script test.sh
     
    verif_val() {
    if (( $val == 18 ))
    then 
    		echo "erreur"
    		exit 1
    else 
    		echo "Et voila $val"
    fi
    }
     
    integer cpt=1 cpt2=3
     
    tab[1]="toto tata"
    tab[2]="1 2 3 4 5 6 7 8 9"
    tab[3]="11 12 13 14 15 16 17 18 19"
     
     
    while (( cpt <= cpt2 ))
    do
    	for val in ${tab[${cpt}]}
    	do
    		verif_val
    	done
    	if (( $? == 0 )) 
    	then
    			echo "Fin avec succes du test"$cpt
    	else
    			echo "Echec lors du test"
    			exit 1;
    	fi
    	(( cpt += 1 ))
    done
     
    exit 0

  2. #2
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Un peu violent la sortie par exit.

    Regarde du coté de return.

    PS : évite les fichiers word. Utilise plutot les balises "[ CODE ][ /CODE ]" (le diése) pour insérer ton code dans le forum.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  3. #3
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Plusieurs choses:

    • Évite les fichiers inclus, surtout en .doc! pour quelques lignes, tu peux utiliser les balises pour le code (bouton #).
    • Je te donne des réponses pour Bash qui est le plus courant sous Linux.
    • À la place de exit, tu pourrais essayer return.
    • le mot clé integer n'existe pas; à la rigueur declare -i var. Mais ce n'est pas nécessaire.
    • Il y a une erreur de conception: le test de fin de boucle if (( $? == 0 )) ne vérifie que la dernière boucle, pas l'ensemble.
    • La manière de coder peut être améliorée.

    Voici quelques transformations que j'ai apportées.
    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
    #!/bin/bash
    
    verif_val()
    {
        if [ $val = 18 ]
        then 
            echo "erreur"
            return 1
        else 
            echo "Et voila $val"
        fi
    }
    
    tab[1]="toto tata"
    tab[2]="1 2 3 4 5 6 7 8 9"
    tab[3]="11 12 13 14 15 16 17 18 19"
    
    for index in $(seq 1 ${#tab[@]})
    do
        retValue="0"
        for val in ${tab[${index}]}
        do
            verif_val
            retValue=$(( $? + $retValue ))
        done
        if [ $retValue = 0 ]
        then
            echo "Fin avec succes du test $index"
        else
            echo "Echec lors du test $index"
            exit 1
        fi
    done
    S'il te manque des explications, demande.

    Edit: La commande exit 1 est une erreur; il faut continuer, même si un problème est apparu durant une boucle de test. Je crois.

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    Le shebang est important.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

Discussions similaires

  1. Script Shell avec fonction FTP
    Par blackstreet dans le forum Distributions
    Réponses: 1
    Dernier message: 18/09/2007, 09h33
  2. Réponses: 6
    Dernier message: 08/06/2006, 10h07
  3. Fonction shell > Est ce possible ?
    Par ClaudeG dans le forum Access
    Réponses: 9
    Dernier message: 19/05/2006, 10h29
  4. Fonction linux shell
    Par hanane93 dans le forum Linux
    Réponses: 4
    Dernier message: 05/12/2005, 14h00
  5. [Système] Probleme de Sortit des Fonction Shell
    Par kedare dans le forum Langage
    Réponses: 1
    Dernier message: 14/09/2005, 17h44

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