Ecrire script bash dans un script bash

Résolu
Bonjour,

Je voudrais écrire un script bash qui prend plusieurs arguments et qui à partir de ces arguments me génère un autre script bash (C'est tordu mais j'utilise cette méthode car j'appelle crontab à la fin de mon script afin de exécuter plusieurs fois à une intervalle prédéfini le script généré dans un fichier) .

Mon problème, c'est que j'utilise

echo "mon script ... " > nom_du_script.sh

pour générer le script et que lorsque je "compile" il me remet à la figure le script généré avec à la fin un "not found".

Si quelqu'un connaît ce problème ?

8 réponses

  1. Contributeur
    Salut,

    et que lorsque je "compile"
    Euh... c'est à dire ?
    Pour rappel les scripts bash sont dits interprétés et non compilés ;-\

    Peut être qu'en voyant ton script on verrait mieux où ça cloche, non ?
    0
    1. Salut,

      Oui, c'est pour cela que j'ai mis "compiler" entre guillemets.
      Je voulais effectivement dire lorsque je l'interprète.

      Pour le code, je peux mettre son corps :
      if test $# -ne 3
      then 
        echo "Il me faut 3 arguments! "
      else
        echo " #!/bin/sh ... Long script bash qui interroge une base mysql en utilisant deux des trois arguments et qui parse des fichiers ..." > chemin/fichier/nom_fichier.sh
      
        crontab -e */$3 * * * * chemin/fichier/nom_fichier.sh >/dev/null 2>&1; 
      fi
      
      0
      1. Contributeur
        Long script bash qui interroge une base mysql en utilisant deux des trois arguments et qui parse des fichiers
        Est-ce que chacune des commandes contenues dans cet "echo" marche si elles sont lancées individuellement ?
        0
    2. Oui, elles marchent toutes mais j'ai tout de même oublier de préciser que lorsque j'interprète mon code et qu'il me balance le script généré avec l'erreur "not found", le script généré met un blanc lorsque je réutilise une variable déclaré ce code. Exemple :
      echo "#!/bin/sh 
      test = 'mysql ...'
      test2 = $test  + 1 // ici a la place de $test il me met un blanc alors que lorsque je l'exécute en dehors de ce script, j'obtient le bon résultat. 
      
      0
      1. Contributeur
        Euh... en bash, il ne faut pas d'espace autour du signe égale quand on déclare une variable !

        test=$(mysql ...)


        PS. La syntaxe avec les quotes inverses (le code html de CCM ne permet pas leur affichage) n'est plus de mise et est remplacée par : $(commande)
        0
    3. C'est tordu
      Je vais dire comme toi: c'est tordu (mais je pense à autre chose). :(
      mais j'utilise cette méthode car j'appelle crontab à la fin de mon script afin de exécuter plusieurs fois à une intervalle prédéfini le script généré dans un fichier
      Quel rapport entre la méthode et crontab ?

      un script doit être exécutable, pour être interprété par le noyau.

      l'option -e de crontab ne fait pas ce que tu crois, regarde la page man!
      0
      1. Merci Zipe31, je vais essayer de remplacer tous cela pour voir si cela change quelque chose.
        Pour les espaces, je n'en ai pas mis, c'etait juste pour illustrer mon problème.

        Pour qqchquicommenceparQ, il me semblait que crontab -e permet d'éditer la table cron ?

        Je dit 'j'utilise cette méthode" car je ne voit pas comment demander à crontab d'exécuter le script dans lequel il est appelé.
        Il me semble que cela pourrait causé quelques petits problèmes.
        C'est pour cela que je crée un script dans ce script pour pouvoir ensuite appeler le script généré avec crontab.
        Si j'ai fait une erreur la dessus, ton aide est la bienvenue ! :)
        0
        1. Pour Zipe31, j'ai remplacer toutes les quotes inverses mais maintenant il me met :
          Syntax error: "(" unexpected (expecting ")") 

          J'ai vérifié et a priori, je n'ai aucun problème de parenthèses !
          0
          1. Contributeur
            Quel shell ? Quel système ?
            0
        2. Le shell : /bin/bash (c'est bien la commande echo $SHELL pour savoir, j'ai un doute)
          Et le système : Debian (Dernière version)
          0
          1. Contributeur
            Alors pourquoi tu mets "#!/bin/sh" dans tes scripts ?

            Quel système ?
            Vers où pointe /bin/sh ? (readlink -f /bin/sh)
            0
          2. Pour le "#!bin/sh" je ne pensais pas que c'étais gênant (je n'ai jamais eu de problème avec en tout cas).
            Sinon /bin/sh pointe sur /bin/dash
            0
          3. Contributeur
            Sinon /bin/sh pointe sur /bin/dash

            D'où les erreurs avec "$(commande)" ;-((
            0
          4. Non je ne pense pas.
            Dash est le shell par défaut sous debian et ubuntu.
            0
        3. Je dit 'j'utilise cette méthode" car je ne voit pas comment demander à crontab d'exécuter le script dans lequel il est appelé.
          [...]
          C'est pour cela que je crée un script dans ce script pour pouvoir ensuite appeler le script généré avec crontab.


          Je ne vois pas en quoi mettre un tourne vis au cul d'un autre tournevis va faire en sorte qu'il tourne plus régulièrement.
          Cette "logique" m'échappe.
          0
          1. Bon j'ai résolu mon problème.
            0
          2. Contributeur
            Happy for you, mais comment ???
            0