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 :

Caractères spéciaux (débutant) :


Sujet :

Shell et commandes GNU

  1. #1
    Membre très actif
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut Caractères spéciaux (débutant) :
    Bonjour ,

    J'ai un nouveau souci avec les chaines de caractères.
    Il se trouve que je veux constituer une commande SQL et lorsque je concatènes les différentes chaines de caractères constituant mon
    odre final dans un fichier : j'ai des sauts de ligne en trop ??

    echo "SELECT $colonnes FROM $table ;" >> REQUETE.sql

    Il se trouve que la variable $colonnes qui tient sur une seule ligne se trouve
    scindée en plusieurs lignes ?

    J'ai ceci par exemple :
    SELECT "COLONNE 1" "
    " || ' ' || "COLONNE2
    " || ' || "COLONNE3
    " || '! !' || "COLONNE4" FROM TALE88
    ";
    EXIT;


    Est ce que quelqu'un aurait déjà rencontré ce problème ?

  2. #2
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    La demande n'est pas claire. Pourquoi n'as-tu pas mis ce que tu obtiens (avec erreur) et ce que tu voudrais avoir. Et surtout, n'oublie pas les balises [ CODE ] et [ /CODE ].
    Je dois faire à peu près la même chose que toi. Voici comment je m'y prends (ça marche correctement).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    echo "\
    set pages 100;
    set lines 150;
    set head off;
    select
     A.FIELD1 || '$sep' ||
     B.FIELD1 || '$sep' ||
    from
     DB.TABLE_A A,
     DB.TABLE_B B
    where
     B.FIELD1 = A.FIELD2 AND
     A.FIELD3 = 'NAME1';
    exit;" > $workFile.dbRequest

  3. #3
    Membre très actif
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut
    Ouai pardon pour les balises , je ne suis pas trés habitué au forum du site

    En fait je me suis mal expliqué

    Je constitue ma requête SQL à partir de plusieurs variables.

    Par exemple j'ai la variable $colonnes qui a la valeur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT "COLONNE 1" "  " || ' ' || "COLONNE2 " || ' || "COLONNE3 "
    Et quand je concatène cette variable dans un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "SELECT $colonnes  FROM table9 ;" >> sql/REQ_CREATE_EXCEL.sql
    si je vérifie le contenu du fichier ainsi créé (REQ_CREATE_EXCEL.sql) ,
    je me retrouves avec des sauts de lignes : par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT "COLONNE 1
    " "  " || ' ' || "COLONNE2 
    " || ' || "COLONNE3 
    "   
    FROM table9 ;
    Ou peut être je n'ai pas compris ta réponse ?

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    C'est parce que "echo" ajoute un retour à la ligne à la fin de ta chaine. Pour ne pas ajouter de retour à la ligne, tu peux faire echo -n "ta chaine" (avec bash et la pluspart des autres shells "gnu") ou bien echo "ta chaine\c" (avec ksh et la pluspart des shells unix traditionels.

    Comme tu le constate, echo n'est pas portable. Si tu veux rester portable, il vaut mieux utiliser printf : printf "%s" "ta chaine"

    Edit : j'ai lu trop vite, je croyais que tu faisais plusieurs echo. Comme dit jmelyn dessous, c'est surement tes variables $colonnes et $table qui contiennent des retour à la ligne.

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Comme le dit matafan, la commande echo est un peu sensible. Néanmoins, je crois que le formatage de la variable colonnes comporte peut-être un défaut. Pour en être sûr, pourrais-tu faire un echo "$colonnes" dans ton script? Fais bien attention de mettre les guillements. Si le résultat est en plusieurs lignes, c'est que l'initialisation de cette variable n'est pas correct.

  6. #6
    Membre très actif
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut
    Merci pour ces éléments de réponse.

    En fait quand je fais un echo dans un fichier de la variable , j'ai le texte suivant sans retour à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     "COLONNE1 "  || '! !' || "COLONNE2"  || '! !' || "COLONNE3"

    Ensuite je concatènes le contenu de cette variable avec d'autres
    chaines de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo "SET HEAD OFF;" >> requete.sql
    echo "SET FEEDBACK OFF;" >> requete.sql
    echo "SELECT  $requete  FROM $table ORDER BY $order;" >> REQUETE.sql
    Et c'est dans ce fichier final que l'on trouve des sauts de lignes que
    la commande plsql depuis CygWin n'aime pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SET HEAD OFF;
    SET FEEDBACK OFF;
    SET LINESIZE 600;
    SET PAGESIZE 0;
    SELECT   'COLONNE1' || '! !' || "COLONNE2
    "  || '! !' || "COLONNE3"  FROM TABLE1 ORDER BY "COLONNE4
    ";
    En fait ce que je voudrais avoir ce serait l'ordre SELECT en entier jusque au point virgule sur une seule ligne sans retour chariot.

  7. #7
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Pour voir ce qui ne va pas dans le programme, le mieux est de mettre le code directement. Peux-tu donner exactement l'initialisation de $requete? Mets bien tout, le diable se cache dans les détails.

  8. #8
    Membre très actif
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut
    En fait le code est le suivant , mais ce qui est bizarre c'est que si je fais un echo aprés la création de cette variable ça tient sur une seule ligne.
    En fait j'ai une boucle sur les colonnes dans un fichier
    et la variable colonnes est constituée comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    While ... do
      ...
      colonneLue=\"$column\"
      colonnes="$colonnes || '!$space!'||$colonneLue"
       ...
    done
    En fait c'est le fait de rajouter les " " pour entourer le nom de colonne qui provoque le saut à la ligne.
    Sans eux , les sauts de ligne on lieu au bon endroit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT   COLONNE1
      || '! !' || COLONNE2
      || '! !' || COLONNE3
      || '! !' || COLONNE4 FROM TABLE1

  9. #9
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Tu n'as sans doute pas bien compris: Il est nécessaire que tu mettes le code exact de ton programme, pas quelque chose qui y ressemble. Dans le code que tu dévoiles, il y a deux erreurs qui font que le code ne peut pas tourner: While et les ! qui sont interprétés par le shell.

  10. #10
    Membre très actif
    Inscrit en
    Août 2006
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 160
    Par défaut
    en fait le code qui créé la liste des colonnes pour l'ordre SQL est le suivant:

    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
    20
    21
     
     
     numColumn=`awk -F ' ' '{print NF}' tmp/GET_COLUMN.txt`
     
        while [ $i -le $numColumn ]
             do
                  column=`awk -F ' ' '{print $'$i'}' tmp/GET_COLUMN.txt`	
    	 columnRequete=\"$column\"
                      if [ $i -eq 1 ] 
                      then	
    	          requete="$requete '$table' || '!$space!' || $columnRequete"
     
    		cle=$columnRequete
     
                    else
     
    		requete="$requete  || '!$space!' || $columnRequete"
                      fi
     
                        i=`expr $i + 1`
                    done
    Et en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "$requete" >> fichier.txt
    dans le fichier cela tient sur une ligne sans saut de ligne.

    Est ce que ce serait pas plutôt le echo qui constitue la requête finale
    qui rajoute les sauts de ligne ?

  11. #11
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Quelques remarques sur le code:
    • A priori, l'option -F ' ' est inutile, puisque la variable FS de awk vaut déjà cette valeur.
    • Je me demande comment l'assignation de requete peut tourner sans erreur sous Bash. Au fait, travailles-tu bien avec Bash?
    Essaie plutôt ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     requete="$requete '$table' || '"'!'"$space"'!'"' || $columnRequete"
    Attention à la quantité de quotes, simples ou doubles! Ce qui est en rouge est entre " et ": à l'intérieur les variables sont remplacées, les ' de simples caractères. Ce qui est en bleu est entre ' et ': l'interpréteur ne va pas voir dedans, et le ! n'est pas interprété.

    Idem pour l'autre assignation de requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    requete="$requete  || '"'!'"$space"'!'"' || $columnRequete"

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Par défaut
    C'est vrai que le (!) est particulier pour bash, je l'oublais...

    J'ai fait un petit test rigolo, il semblerait que !$ rappelle la dernière affectation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a=0
    b=!$
    echo $b
    # affiche   a=0
    C'est probablement de là que vient ton problème.

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Non !$ c'est le dernier argument de la dernière commande. Et !^ c'est le premier argument de la dernière commande.

Discussions similaires

  1. Débutant - Problème des caractères spéciaux
    Par powerwave dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/11/2014, 19h29
  2. Où trouver la liste des caractères spéciaux?
    Par gamez dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2003, 18h54
  3. Transformation XSL et caractères spéciaux
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 4
    Dernier message: 28/04/2003, 11h38
  4. [Sybase] filtre sur caractères spéciaux
    Par montelieri dans le forum Sybase
    Réponses: 4
    Dernier message: 07/04/2003, 17h49
  5. Traiter les caractères spéciaux
    Par ricola dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2003, 10h23

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