2013-06-28 3 views
0
while IFS=# read -r process_id source destination type 
do 
     echo "Process id: $process_id" 
     echo "Source: $source" 
     echo "Destination: $destination" 
     case "$type" in 
       2) 
       echo "Type is outbound: $type" 
         contact=$(sqlplus -s ${SQLPLUS_INFO} <<EOF 
         SET PAGESIZE 0 
         SELECT email FROM table WHERE partner = '${destination}'; 
         exit 
         EOF 
         ) 
       echo 
       echo ${contact} 
       echo 
       ;; 

Salut à tous,Comment puis-je transmettre une variable à une requête dans un script shell?

Basé dans le code ci-dessus, comment puis-je passer la valeur de destination $ à la requête? L'exemple ci-dessus ne fonctionne pas, même les autres:

SELECT email FROM table WHERE partner = '"${destination}"'; 
SELECT email FROM table WHERE partner = '$destination'; 

Toute aide vous sera utile! Merci!

+1

supprime les 'contact = $ (' et ')' juste pour voir si c'est la source du problème. Je m'attendrais à ce que cela fonctionne tel quel, mais la substitution de commandes ('$ (...)') pourrait être un problème. Bonne chance. – shellter

+0

Comme idée séparée, ajoutez 'destination d'exportation' avant d'appeler' contact = $ (....) '. Bonne chance. – shellter

+0

contact = sqlplus -s $ {SQLPLUS_INFO} << EOF SET PAGESIZE 0 SELECT email à partir de la table WHERE partner = '$ {destination}'; sortie EOF ne fonctionnait pas bien, il est revenu: ligne 73: erreur de syntaxe: fin de fichier inattendue Tout en utilisant le() ne fonctionne pas aussi bien, retour: erreur de syntaxe près de jeton inattendu ' << ' . . PS: L'export ne fonctionnait pas non plus @shellter, @Emmanuel –

Répondre

3

Qu'est-ce qui se passe lorsque vous exécutez le script avec bash -x? Je demande parce que la notation ici-document s'attend à trouver le marqueur de fin au début d'une ligne. Quand je lance ce code:

#!/bin/bash 

    contact=$(cat - <<EOF 
    input from here document 
    second line 
    EOF 
    ) 

echo "$contact" 

Je reçois des erreurs telles que:

eof.sh: line 3: unexpected EOF while looking for matching `)' 
eof.sh: line 10: syntax error: unexpected end of file 

Si les lignes commencent par onglets, vous pouvez utiliser un tableau de bord avant le marqueur de fin de fichier pour indiquer que les tabulations devrait être ignoré.

#!/bin/bash 

     contact=$(cat - <<-EOF 
     input from here document 
     second line 
     EOF 
     ) 

echo "$contact" 

Ce sorties:

input from here document 
second line 

REMPLACERONT les onglets avec des blancs et vous êtes de retour dans les erreurs de syntaxe. Bien que je l'ai dit en termes de bash, je crois que vous rencontrez les mêmes problèmes avec les coquilles Korn et Bourne aussi. Donc, je soupçonne que votre problème est lié à la mise en forme du document ici dans votre code, mais vous auriez dû voir une sorte d'erreur, donc je suis un peu perplexe. Vous devriez obtenir les substitutions que vous vouliez fait:

#!/bin/bash 

description="The Description" 

     contact=$(cat - <<-EOF 
     input from here document 
     second line with '$description' embedded. 
     EOF 
     ) 

echo "$contact" 

Cela donne:

input from here document 
second line with 'The Description' embedded. 

L'utilisation bash -x peut être utile de tracer l'exécution d'une commande.

Tout cela n'est lié que par hasard à Oracle et SQL * Plus.

+0

Je suppose que j'ai trouvé le problème avec bash -x + echo 'Destination: x' Destination: x + cas "$ type" dans + echo 'Le type est sortant: 2' Type est sortant: 2 + + -s sqlplus user/pass @ EDDB + contact = ' pas de lignes sélectionnées' + écho + écho sans lignes sélectionnées aucune ligne sélectionnée + écho La requête retourne beaucoup d'espaces: + écho 'Destination: x' <<<<< espaces vides Je propose de régler: set linesize 1000 ensemble trimspool sur ensemble pagesize 0 set colsep # mais ressemble à ça ne marchait pas. –

0

Veuillez essayer de supprimer les guillemets simples autour de votre variable: ils empêchent l'interprétation de votre variable (contrairement aux guillemets).

Ce devrait être:

SELECT email FROM table WHERE partner = ${destination}; 
+0

Maintenant, il est retourné: SELECT email FROM table WHERE partenaire = X; script.sh result.csv SELECT.sql ERREUR à la ligne 1: ORA-00904: "X": identificateur invalide N'a pas fonctionné, mais merci pour la suggestion. –

+1

SQL requiert une valeur de texte à entourer de guillemets simples. – shellter

Questions connexes