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 :

Modification d'une variable passée en paramètre


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut Modification d'une variable passée en paramètre
    Bonjour,

    Voilà mon souci. Je cherche à modifier la valeur d'une variable que je passe en argument d'une fonction.

    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
    maFonction
    {
        if  ping -c 3 192.168.xxx.xxx
        then
             $1=true
        fi
     
        echo ${var1} #devrait renvoyer true si ping ok
    }
    var1=false
    var2=false
     
    maFonction '$var1'
    ...
    maFonction '$var2'
    Quand je teste mon script, j'obtiens ce genre d'erreur
    test.sh: line 86: $var1=true: command not found

    Est-ce que quelqu'un a une idée? La solution alternative est d'utiliser case mais c'est beaucoup plus long.

    merci d'avance

    edit:j'ai complété la fonction que j'utilise

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 118
    Points : 28 510
    Points
    28 510
    Par défaut
    Et en faisant comme ça, ça ne fonctionnerait pas mieux ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par kstou2001 Voir le message
    Bonjour,

    Voilà mon souci. Je cherche à modifier la valeur d'une variable que je passe en argument d'une fonction.

    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
    maFonction
    {
        if ...
        then
         $1=true
        fi
     
     
    }
    var1=false
    var2=false
     
    maFonction '$var1'
    ...
    maFonction '$var2'
    Quand je teste mon script, j'obtiens ce genre d'erreur
    test.sh: line 86: $var1=true: command not found

    Est-ce que quelqu'un a une idée? La solution alternative est d'utiliser case mais c'est beaucoup plus long.

    merci d'avance
    Bonjour,

    As-tu essayé avec :
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typeset var=$1
    var="true"
    et de lancer tes fonctions comme ça : (sans les apostrophes)

  4. #4
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Une fonction se déclare soit comme ça function maFonction { cmd; }, soit comme ça maFonction () { cmd; } (note les parenthèses dans le second cas).

    Et d'autres part si tu encadres tes variables par des quotes simples maFonction '$var1' elles ne seront pas interprétées
    Il faut obligatoirement les entourées de quotes doubles maFonction "${var1}". Les entourées également d'accolades est une bonne habitude à prendre.

  5. #5
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut
    Merci pour la réponse mais le problème est identique.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Points : 38
    Points
    38
    Par défaut
    Et ceci :

    mafonction ${var1} ?

  7. #7
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Et d'autres part si tu encadres tes variables par des quotes simples maFonction '$var1' elles ne seront pas interprétées
    Il faut obligatoirement les entourées de quotes doubles maFonction "${var1}". Les entourées également d'accolades est une bonne habitude à prendre.
    Dans mon cas je ne souhaite pas utiliser la valeur de la variable mais son nom pour lui affecter ensuite une valeur.

    Mettre des doubles quotes me génère cette erreur
    test.sh: line 86: false=true: command not found

  8. #8
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par Aiglon13 Voir le message
    Bonjour,

    As-tu essayé avec :
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typeset var=$1
    var="true"
    et de lancer tes fonctions comme ça : (sans les apostrophes)
    maFonction $var1
    ou
    maFonction "$var1"
    =
    maFonction false

    J'ai rajouté un echo $1 dans maFonction. Il n'y a qu'avec les simple quote que je récupère le nom de ma variable. Par contre impossible de lui affecter une valeur.

  9. #9
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par kstou2001 Voir le message
    Dans mon cas je ne souhaite pas utiliser la valeur de la variable mais son nom pour lui affecter ensuite une valeur.
    Alors le "$" est inutile devant

    Quid de ta déclaration de fonction ? L'as-tu modifié ?

    Sans savoir ce que fait ta fonction exactement, difficile d'interpréter le résultat de ton erreur

  10. #10
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Alors le "$" est inutile devant

    Quid de ta déclaration de fonction ? L'as-tu modifié ?

    Sans savoir ce que fait ta fonction exactement, difficile d'interpréter le résultat de ton erreur
    ma fonction va pinger un serveur. S'il répond la variable passe à true. (je venais de compléter maFonction pour être plus parlant)

    J'ai déjà essayé d'appeler la fonction de la manière suivante mais c'est pas mieux
    maFonction 'var1'
    erreur:essai.sh: line 6: var1=true: command not found==> pourtant c'est ce que je souhaite: que var1 passe à true.

  11. #11
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Affiche ton code complet, on n'est pas devin

  12. #12
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Affiche ton code complet, on n'est pas devin
    Il est en début de post. Je teste sur ce code avant de l'appliquer à mon vrai script.
    En adaptant l'adresse IP par une en service on devrait avoir
    echo ${var1} qui affiche true.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    maFonction
    {
        if  ping -c 3 192.168.xxx.xxx
        then
             $1=true
        fi
     
        echo ${var1} #devrait renvoyer true si ping ok
    }
    var1=false
    var2=false
     
    maFonction '$var1'

  13. #13
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    
    maFonction () {
        if  ping -c 1 192.168.xx.xx &>/dev/null
        then
             eval $1=true
        fi
         echo ${var1} 
    }
    var1=false
     
    maFonction 'var1'

  14. #14
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function maFonction
    {
        if  ping -c 3 192.168.1.253
        then
             eval $1=true
        fi
        echo ${var1} #devrait renvoyer true si ping ok
    }
     
    var1=false
    var2=false
     
    maFonction var1
    maFonction var2

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    maFonction() {
        ping -c 3 192.168.1.253 >/dev/null 2>&1 && echo true
    }
     
    var1=false
    var2=false
     
    var1=$(maFonction)
    var2=$(maFonction)
    à mon avis, le raisonnement de kstou2001 n'est pas correct.

    Il nous faudrait le script complet pour voir comment utiliser la fonction, si elle est vraiment nécessaire, de même que ces variables.

    Il faudrait aussi nous dire quel interpréteur de commandes tu utilises.

  16. #16
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maFonction() {
        ping -c 3 192.168.1.253 >/dev/null 2>&1 && echo true || echo false
    }

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    très juste jlliagre, la substitution de commande écrase la précédente valeur de la variable, même si la commande échoue.

  18. #18
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function maFonction
    {
        if  ping -c 3 192.168.1.253
        then
             eval $1=true
        fi
        echo ${var1} #devrait renvoyer true si ping ok
    }
     
    var1=false
    var2=false
     
    maFonction var1
    maFonction var2
    Merci. Grâce à la commande eval, je peux affecter la valeur à une variable passée en argument.

  19. #19
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 102
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    à mon avis, le raisonnement de kstou2001 n'est pas correct.

    Il nous faudrait le script complet pour voir comment utiliser la fonction, si elle est vraiment nécessaire, de même que ces variables.

    Il faudrait aussi nous dire quel interpréteur de commandes tu utilises.
    En raccourci, j'avais besoin d'une fonction pour tester la connexion avec différents réseaux.
    En plus approfondi, chaque réseau possède 2 liaisons, une principale et une de secours (valeurs passées en argument). Je teste d'abord le principal puis le secours. Je fais ça pour chaque réseau. Ensuite je regarde à l'intérieur du réseau et c'est pour ça que j'essayais de passer une variable en argument.

    Le code complet pour résoudre mon problème était inutile sauf si on voulait trouver une solution de contournement.

    Pour l'interpréteur de commande c'est le Bourne Shell.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 596
    Points : 19 481
    Points
    19 481
    Par défaut
    eval est la solution de facilité, et elle comporte certains risques (qui n'apparaissent pas ici), qui me font souhaiter qu'on ne la propose pas pour des problèmes simples.
    En général, l'utilisation d'eval souligne une erreur "algorithmique" (?).
    Code monTestReseau : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
     
    for adresse #sous-entendu «in "$@"»
    do ping -c 1 $adresse && exploration_reseau $adresse
    done
    c'est plus compliqué que ça ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/03/2014, 22h54
  2. Réponses: 11
    Dernier message: 01/02/2011, 16h20
  3. Nom d'une variable passée en paramètre à une fonction
    Par cata2 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 07/09/2007, 10h17
  4. modification d'une chaîne passée en paramètre
    Par g0up1l dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 25/03/2007, 19h17
  5. Réponses: 6
    Dernier message: 28/05/2004, 10h39

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