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 :

Problème de passage de variable vide


Sujet :

Linux

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant technique dans les ERP
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technique dans les ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut Problème de passage de variable vide
    Bonjour à tous,

    Voilà, j'ai un problème de passage de variable vide à un script sh à l'intérieur d'un autre script sh.

    Explication :
    Dans le premier script, je créé plusieurs variables tableau et dans une boucle, j'utilise leurs valeurs en les passant à un script que j'appelle dans cette même boucle.
    Jusque là, pas de problème.

    Seulement, lorsque la tableau à un certain index contient une valeur nulle, c'est comme si aucun paramètre n'était passé au script.
    Cela a pour conséquence dans le script appelé de décalé les valeurs des paramètres.
    Par exemple : Si le paramètre 3 est vide dans la ligne d'appel, alors dans le script appelé, ce qui devait contenir la valeur du paramètre 3 contiendra la valeur du paramètre 4. D'où le décalage.

    La solution serait donc de protéger les valeurs passées entre deux "quote".
    Mais comme un problème n'arrive jamais seul, l'un des paramètres est le chemin complet d'un fichier de log.
    Donc si je protège mes paramètres avec des "quote", dans le script appelé, la valeur du paramètre en question sera de la forme 'un/chemin/vers/le_fichier.log'
    Et apparemment, cette forme avec les deux "quote" pose un problème lors du test d'existence du fichier.
    Voici un petit bout de code illustrant le test :
    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
     
    PSHOME=$1
    AS=$2
    PS=$3
    CMD=$4
    PURGE=$5
    SCR_LOG=$6
    TYPE=$7
    SSH_USER=$8
    SERVER=$9
     
    ERROR=0
    EDATE=`date '+%d-%m-%Y_%Hh%M'`
     
    echo 'SCR_LOG = '$SCR_LOG
    #Si le fichier n'existe pas
    if ! [[ -f $SCR_LOG ]]; then
      #Du code
    fi
    Or le fichier existe bien et pourtant à l'exécution, le code à l'intérieur de la boucle est exécuté.

    Il y aurait bien une solution en testant la valeur du paramètre avant de le passer au script appelé, mais ce n'est pas une solution très sexy.

    Alors si quelqu'un aurait une solution propre à me proposer, je suis preneur.


    Merci à tous

    Bonne journée

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    Bonjour,

    sh n'utilise pas les tableaux !

    en bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ ScriptAppele() { echo "$1";}
    $ ScriptAppelant() {
       arr[0]="foo"; arr[1]="bar"; arr[2]=''; arr[3]="baz"
       for i in "${arr[@]}"; do ScriptAppele "$i"; done
    }
    $ ScriptAppelant 
    foo
    bar
     
    baz
    pas de problème
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant technique dans les ERP
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technique dans les ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    En effet, j'ai lu que sh n'utilise pas les tableaux.
    Au début de mon script j'ai bien la ligne #!/bin/sh.

    J'ai donc été très surpris lorsque j'ai essayé d'utiliser les tableaux et que ça a marché

    Après, peut-être est-ce du au fait que je travail sur AIX 6.1, mais cela m'étonnerai car j'ai installé Cygwin sur Win7 et ça marche de la même façon.


    Concernant ton exemple, ça marche en effet, seulement le problème ne se pose pas dans le cas que vous présentez car vous ne passez les paramètres un à un en faisant des appels successifs à la fonction ScriptAppele.

    Si vous appeliez le script avec tous les paramètres, et que dans le script appelé vous affectiez chaque valeur à une variable, vous verriez que la variable censée contenir la valeur du paramètre 3 (donc '') contiendra la valeur du paramètre 4 (baz)


    Pouvez-vous me confirmer ce comportement ?


    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    bof
    en reprenant le tableau arr, tel que défini plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ScriptAppele() { myArr=( "$@" ); printf '%s\n' "${myArr[@]}";}
    $ ScriptAppele "${arr[@]}"
    foo
    bar
     
    baz
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Consultant technique dans les ERP
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technique dans les ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Ok, donc une solution qui réglerait le problème serait de passer les paramètres par un tableau.

    Je vais essayer ça.


    Merci pour tes réponses.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant technique dans les ERP
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technique dans les ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    L'utilisation d'un tableau pour passer des paramètres règle le problème, mais rend l'utilisation du script moins claire.

    Une autre solution possible et qui marche dont j'ai fait mention dans mon premier post est de protéger les variables.
    Le problème que j'avais avec cette solution était que la valeur de la variable contenait ces "quote" de protection.

    Mais pour régler ce nouveau problème, il suffisait d'extraire les valeurs des paramètres sans les "quote" et en les réaffectant à eux-mêmes.

    Exemple :

    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
     
    # Code dans le script d'appel
    $SCRIPT_APPELE "'"$VAR1"'" "'"$VAR2"'" "'"$VAR3"'" "'"$VAR4"'"
     
     
    # Code dans le script appelé
    VAR1=$1
    VAR2=$2
    VAR3=$3
    VAR4=$4
     
    VAR1=`expr "$VAR1" : "^'\(.*\)'$"`
    VAR2=`expr "$VAR2" : "^'\(.*\)'$"`
    VAR3=`expr "$VAR3" : "^'\(.*\)'$"`
    VAR4=`expr "$VAR4" : "^'\(.*\)'$"`
    De cette manière, il n'y a jamais plus de décalage lors de l'affectation des valeurs des paramètres dans le script appelé si dans la ligne d'appel du script appelant l'un des paramètres passés au script appelé est une valeur nulle.

    Ainsi l'utilisation du script appelé reste clair si tant est que le nom des paramètres correspond à leur usage


    Si quelqu'un a une meilleure solution ou s'il trouve que la solution présente n'est pas propre, j'accepterai volontiers ses remarques afin d'en discuter


    Merci à vous tous

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    as-tu essayé en échappant les guillemets "intérieurs" :script_appelant "\"$var1\"" "\"$var2\""?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Consultant technique dans les ERP
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technique dans les ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Et bien j'imagine que la syntaxe "\"$var1\"" doit être équivalente à "'"$var1"'" non ?

    Du coup en employant la méthode que j'ai décrite, je n'ai plus de problème.
    En fait c'est comme en Batch. Dans ce langage il faut protéger les variables en les passant à un autre Batch puis à l'intérieur de celui-ci initialiser avec la valeur des paramètres les variables en utilisant une syntaxe particulière qui est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    # Script .bat appelant
     
    CALL un_autre_script_batch "!var1!" "!var2!" "!var3!" "!var4!"
     
     
    # Script .bat appelé
     
    var1=%~1
    var2=%~2
    var3=%~3
    var4=%~4
    Le caractère ~ permet de supprimer les caractères ' ou " en début et en fin de chaine.

    Est-ce qu'il existe une commande équivalente permettant de faire cette opération en script shell ? Si oui quelle est-elle ?


    Merci

  9. #9
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    J'ai l'impression que tu te compliques la vie pour rien. Tu peux me donner la minière exacte dont tu appèles le script de ton premier post ? Ce script devrait fonctionner si tu l'appèles correctement.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Consultant technique dans les ERP
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technique dans les ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    J'initialise une variable avec le chemin du script
    j'appelle cette variable en passant les paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    # Du code...
     
    STOPSTART_ASPS_SCRIPT=$SCR_DIR_NAME'/Stop-Start_AS-PS.sh'
     
    # Encore du code...
     
    $STOPSTART_ASPS_SCRIPT "'"$PS_HOME"'" "'"$AS"'" "'"$PS"'" "'"$CMD"'" "'"$PURGE_MODE"'" "'"$SCR_LOG"'" "'"$CMD_TYPE"'" "'"$SSH_USER"'" "'"$SERVER"'"

  11. #11
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Il suffit simplement de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $STOPSTART_ASPS_SCRIPT "$PS_HOME" "$AS" "$PS" "$CMD" "$PURGE_MODE" "$SCR_LOG" "$CMD_TYPE" "$SSH_USER $SERVER"
    Les double quote permettant de passer une variable vide sous la forme d'un argument vide. Accessoirement elles permettent aussi d'éviter le "word splitting" et ainsi de s'assurer que la variable est passée sous la forme d'un seul argument, même si elle contient des espaces.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Consultant technique dans les ERP
    Inscrit en
    Octobre 2005
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant technique dans les ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2005
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Merci beaucoup pour cette réponse.
    J'évite tellement d'utiliser les double quote que je n'avais même pas penser à les passer comme ça d'autant plus que je les utilise pour échapper les simple quote...

    Bon et bien je vais me cacher mais je ressortirai un jour


    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AJAX] Passage de variable en ajax
    Par carlatocer dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/02/2007, 14h46
  2. Problème de passage de variable
    Par Duero dans le forum Balisage (X)HTML et validation W3C
    Réponses: 18
    Dernier message: 08/09/2006, 18h00
  3. Réponses: 4
    Dernier message: 20/06/2006, 13h12
  4. problème de passage de variables par POST
    Par jeanfrancois dans le forum Langage
    Réponses: 7
    Dernier message: 03/05/2006, 13h36
  5. [FLASH MX] Problème de passage de variable
    Par mandaillou dans le forum Flash
    Réponses: 2
    Dernier message: 15/11/2005, 10h22

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