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

  1. #1
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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 confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    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 du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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 du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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 du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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 du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 594
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    pourquoi ne pas utiliser un tableau ?

  8. #8
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    Par défaut
    Parce que je ne suis pas un expert ... et que je vais mettre bp de temps à chercher. Mais je suis ouvert à toute information sur le sujet.

    Maintenant que j'ai mes paramètres et leurs valeurs, je veux les substituer.
    Alors je pensais faire un sed dans la boucle, mais pour l'instant je n'y arrive pas.

    Rajouter echo $req |sed 's/$nom_param/$val_parm' dans la boucle ne fonctionne pas.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    Par défaut
    je ne comprend pas pourquoi tu t'em...brouilles ainsi.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from TB1 where col1=$1 and ( col2=$2 or col3=$3)
    et puis c'est tout, non ?

  10. #10
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    Par défaut
    Ca ça fonctionne quand tu as toujours 3 variables.
    En fait je dois faire une gestion des arrêts dans les jobs, en fonction du code retour de ma requête.
    je vérifie donc que des données ont bien été insérées.

    Hors pour un job, la requête de vérif n'est pas la même. j'ai donc établit un fichier avec le n° de la requête à exécuter (envoyée en paramètre lors de l'appel du jeb de verif) et les paramètres dont a besoin la requête (donc les valeurs des colonnes)

    Mais pour la verif de mon job1 j'aurai 2 params, pour celle du job2 j'aurai un seul param, le job3 j'en aurai 3.
    Etc ... et je veux faire un seul script shell pour gérer cela.

    Mon fichier est constitué ainsi aujourd'hui :

    1|param1|select count(*) from td_per where id_mois=param1
    2|param1;param2|select count(*) from tb_param_ref_err where id_mois=param1 and cd_parm=param2
    3|param1;param2;param3|select count(*) from td_str where id_mois=param1 and (b_tie_rsq=param2 or b_tie_lst_noir=param3
    ~

    Plus de détail ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    Par défaut
    on recommence :
    tu veux que le script exécute une requête en fonction du nombre d'arguments qui lui est passé

    c'est ça ?

  12. #12
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    Par défaut
    Exactement.
    Enfin presque ... vu que je m'appuie sur la "deuxième" partie de ma ligne où sont énumérés les paramètres que je dois passer.

  13. #13
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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'` ???

  14. #14
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    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 ?

  16. #16
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    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"

  18. #18
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    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 ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 594
    Points : 19 473
    Points
    19 473
    Par défaut
    mon fichier résultat est vide.
    quel fichier ?

  20. #20
    Membre du Club
    Inscrit en
    Février 2008
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 107
    Points : 44
    Points
    44
    Par défaut
    Maintenant j'ai ce qu'il me faut ou enfin presque dans $resultatRequete.
    Cepandant la ligne vide avant et après le résultat me gêne un peu.
    Je pense que l'on peut y remédier avec un paramètre set xx, mais je ne sais plus lequel.

    Voici mon résultat :


    1

    Et je voudrais avoir que le 1

+ 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: 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