Forum Programmation.shell [Résolu] Exécuter un script contenu dans une variable

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
26
mar.
2013

Bonjour, bonsoir,

Comment peut-on exécuter le script contenu dans une variable ?
Avec les fonctions composées d'une seule partie ça fonctionne :

var="echo salut"
$var
  salut

Mais dès qu'on utilise des fonctions plus compliquées, bash ne comprend plus :

var="for ((i=0,i<9,i+=1)); do echo $i; done"
$var
  bash: for: command not found

De même pour :

while  if ...

Merci de votre lecture !

  • # boucle for qui ne fonctionne pas

    Posté par  . Évalué à 2.

    deja ta boucle for seule ne fonctionne pas chez moi

    /tmp/essai.sh: 1: /tmp/essai.sh: Syntax error: Bad for loop variable

    ensuite ca fait comme pour toi.

    j'ai reecrit ce que tu voulais faire.

    #!/bin/bash
    mytest='for (i=0,i<9,i+=1); do echo $i; done'
    eval $mytest
    
    

    ne fonctionne pas
    par contre

    mytest='for i in `seq 1 9`; do echo $i; done'
    eval $mytest
    
    

    fonctionne

    • [^] # Re: boucle for qui ne fonctionne pas

      Posté par  . Évalué à 1.

      Pour ma syntaxe, je me suis trompé : c'est avec des ';' et pas des ','

      J'avais pensé à eval, mais j'ai pas fait attention et j'ai marqué :

      var="…"

      au lieu de :

      var='…'

      Du coup, quand je faisait eval, j'obtenais :

      10
      10
      10

      au lieu de :

      0
      1
      2

      Merci !!

    • [^] # Re: boucle for qui ne fonctionne pas

      Posté par  . Évalué à -1.

      ce sont des points-virgules et non des virgules qu'il faut dans cette syntaxe de for (comme en C) :

      $ testfor='for ((i=0; i<9; i+=1 )); do echo $i; done'
      
      $ eval $testfor                                      
       0
       1
       2
       3
       4
       5
       6
       7
       8
      
      
    • [^] # Re: boucle for qui ne fonctionne pas

      Posté par  . Évalué à 1.

      Et du coup

      mytest='eval for i in seq 1 9; do echo $i; done'
      $mytest

      fonctionne aussi

  • # Fonction auxiliaire

    Posté par  (site web personnel) . Évalué à 1.

    Tu peux effectivement utiliser eval mais le mieux est d'écrire une fonction auxiliaire — ne serait-ce que parceque c'est plus facile d'écrire ta fonction que ton script entre guillemets!

    • [^] # Re: Fonction auxiliaire

      Posté par  . Évalué à 0.

      Le problème, c'est que la fonction que je récupère entre guillemets, le programme la reçoit d'un autre programme par un fifo. Mais merci quand même !

      • [^] # Re: Fonction auxiliaire

        Posté par  . Évalué à 0.

        wouah, tu veux dire que plutot que de passer une simple info d'un programme à l'autre, tu veux lui passer des bouts de programmes complets ?

        j'ai du loupé une etape mais ce n'est pas trop le principe de communication interprocessus.

        • [^] # Re: Fonction auxiliaire

          Posté par  . Évalué à 3.

          Ben l'info, c'est le bout de programme lui-même, je ne vois pas ce qu'il y a de choquant. C'est exactement le même principe qu'avec le web et javascript.

      • [^] # Re: Fonction auxiliaire

        Posté par  (site web personnel) . Évalué à 2.

        Dans ce cas je te recommandes plutôt de sauver le bout de programme dans un fichier que tu sources (opérateur .) ou que tu appelles dans un sous-shell: c'est plus facile à écrire et plus facile à debugger et en plus tu peux utiliser un programme auxiliaire pour valider l'entrée.

        • [^] # Re: Fonction auxiliaire

          Posté par  . Évalué à 0.

          Dsl en fait j'ai pas tout dis mais justement, je me suis renseigné sur les fifo pour Eviter le passage par des fichiers ^ à cause des fichiers, mes programmes étaient obligés de fonctionner en boucles et les procs n'aimaient pas :s
          Mais merci !

          • [^] # Re: Fonction auxiliaire

            Posté par  (site web personnel) . Évalué à 3.

            Il y a deux choses: 1. le passage d'information ou la synchronisation, 2. et l'utilisation de cette information.

            Tu peux utilsier un fifo pour synchroniser ou échanger l'information, puis la placer dans un fichier avant de la sourcer ou de l'éxécuter.

            Sinon tu peux mettre au point un protocole

            procA: Hé je t'ai placé un bout d'info dans le fichier X > fifo
            procB: < fifo
            procB: . X
            procB: alles klar! > fifo
            
            
            • [^] # Re: Fonction auxiliaire

              Posté par  . Évalué à 1.

              Ah ouai, j'avais pas pensé à ça… Du coup les programmes fonctionnent de la même manière (ils attendent un message de fifo), mais ce message est beaucoup plus léger, et le programme est sur de fonctionner ! Eh bien je te remercie beaucoup pour l'astuce : Merci beaucoup !

              • [^] # Re: Fonction auxiliaire

                Posté par  (site web personnel) . Évalué à 3.

                Là où tu vas beaucoup gagner, c'est quand tu vas devoir deboguer les bouts de programmes que tu échanges. Si le bout de programme est stocké dans un fichier, il est plus facile à lire ou à tester petit bout par petit bout que s'il est dans une variable.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.