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

Programmation système Discussion :

Nombre d'arguments "variable" passés en Shell


Sujet :

Programmation système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut Nombre d'arguments "variable" passés en Shell
    Bonjour,

    Connaissez-vous le moyen de définir des variables dans un script écrit en Ksh, sachant que le nombre de paramètres que je dois passer est "variable".
    Il peut-être de 1, de 2, de 3 ...

    En somme je voudrais attribuer à mes paramètres (param1, param2 ...) la valeur que j'ai passé via le shell.

    Si l'exécution du shell est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ./test.ksh 2010 B7809 A450
    Je veux alors définir 3 variables qui seront param1=2010 param2=99 et param3=A450 et pas une de plus.

    Ces variables vont me servir par la suite à exécuter une requête récupérée dans un fichier tel que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from TB1 where col1=$param1 and ( col2=$param2 or col3=$param3)
    Ai-je été clair ?
    Merci pour votre aide.

  2. #2
    Membre chevronné
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Par défaut
    En testant le contenu de la variable "$#"
    vous connaissez le nombre de paramètre passé en argument de votre shell

    il est donc aisé , avec une boucle de faire ce dont vous avez besoin

  3. #3
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    Oui pour le nombre d'arguments je sais.
    mais j'essayais avec une boucle mais je ne vois pas comment dans ma boucle je peux définir n variables car dans celle-ci $i équivaut au chiffre et nom aux variables $1 $2 ...

  4. #4
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    Pour info :

    si j'ai cela le script ci-dessous je n'ai pas ce que je veux :

    J'envoie les paramètres suivants au script :
    parm1='2010'
    parm2='A450'
    parm3='A480'

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./test.ksh 2010 A450 A480
    Mais je peux très bien avoir uniquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/ksh
    nb_par=$#
    
    i=1
    while [ $i -le $nb_par ]
    do
            nom_parm='parm'$i
            nom_parm=$i
            echo $nom_parm
            let i=$i+1
    done
    Le résultat est (dans le cas où j'ai passé 3 paramètres) :
    1
    2
    3

    Et moi j'attends
    parm1='2010'
    parm2='A450'
    parm3='A480'

  5. #5
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    Avec ./test.ksh 2010 A450 A570

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/ksh
    i=1
    while [ $i -le $# ]
    do
            nom_parm='parm'$i
            echo $nom_parm
            val_parm=$i
            echo $val_parm
            let i=$i+1
    done
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    parm1
    1
    parm2
    2
    parm3
    3
    En fait il me faut récupérer $1, $2 et $3, c'est à dire les paramètres passés.

  6. #6
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    C'est bon j'ai trouvé, c'est avec eval

    #!/bin/ksh
    i=1
    while [ $i -le $# ]
    do
    nom_parm='parm'$i
    echo $nom_parm
    eval val_parm=\$$i
    echo $val_parm
    let i=$i+1
    done

  7. #7
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut Commande sed avec variable
    En même temps si vous arrivez à me donner la solution de ce problème ci-dessous, ça résoudra certainement mon point.

    Pourquoi $nom_parm et $val_parm prennent pas la valeur que je leur ai attribué auparavant, que j'affiche via un echo et qui est bien correcte.

    echo $nom_parm => param1
    echo $val_parm => 2010

    req_valide=`echo $req | sed 's/$nom_parm/$val_parm/g'` ???

  8. #8
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    Le fait de vous poser la question j'ai trouvé via notre pote google.

    Soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req_valide=`echo $req | sed s%$nom_parm%$val_parm%`
    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/sh
    
    case $# in
    1) requete="select count(*) from td_per where id_mois=$1"
    ;;
    2) requete=select count(*) from tb_param_ref_err where id_mois=$1 and cd_parm=$2"
    ;;
    3) requete="select count(*) from td_str where id_mois=$1 and (b_tie_rsq=$2 or b_tie_lst_noir=$3"
    ;;
    esac
    mysql -e "$requete"
    c'est trop simple ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut
    Effectivement mais j'ai préféré mettre mes requêtes dans un fichier pour ne pas encombrer le script.

    Seulement maintenant la requete SQL ne renvoie rien.

    Que dois-je mettre en plus de ma requête pour récupération du résultat uniquement

    J'ai dans le fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1|param1|select count(*) from td_per where id_mois=param1|0
    2|param1;param2|select count(*) from tb_param_ref_err where id_mois=param1 and cd_parm=param2|0
    3|param1;param2;param3|select count(*) from td_str where id_mois=param1 and (b_tie_rsq=param2 or b_tie_lst_noir=param3)|1
    La requête (exemple n° 2) a bien la syntaxe que je lui demande en fonction des paramètres passés, cad :

    select count(*) from tb_param_ref_err where id_mois=201011 and cd_parm='A540'

    Maintenant je veux qu'elle s'exécute, alors dans mon script j'ai :

    sqlplus -s /nolog << EOF
    whenever sqlerror exit 1
    whenever oserror exit 1
    connect $RT_USR/$RT_PWD@$ORACLE_SID
    @./$FIC_SQL > $TRC_SQL
    EOF
    avec les bonnes valeurs pour mes variables.

    Comment puis-je récupérer le résultat ?

    Exemple pour le count(*) : 2

    Merci.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    maFonction() {
    sqlplus -s /nolog << EOF
    whenever sqlerror exit 1
    whenever oserror exit 1
    connect $RT_USR/$RT_PWD@$ORACLE_SID
    @./$FIC_SQL > $TRC_SQL
    EOF
    }
     
    resultatRequete=$(maFonction)
     
    echo "$resultatRequete"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre actif
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Par défaut Caractère à mettre à la fin de la requête pour execution
    D'accord, mais le problème est que mon fichier résultat est vide.

    Donc que dois-je mettre derrière ma requête pour l'exectution.

    J'ai rajouté un ";" puis "quit" et rien n'y fait :
    select count(*) from td_per where id_mois=param1;quit

    Avez-vouss une solution ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 31/10/2005, 17h48
  2. Macros et nombre d'arguments variable
    Par kaisse dans le forum C
    Réponses: 7
    Dernier message: 28/07/2005, 10h10
  3. Nombre d'arguments variable
    Par gege2061 dans le forum C
    Réponses: 7
    Dernier message: 05/08/2004, 15h43

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