Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réutilisation de variable entre script

var1=`cat _var1.txt`

Sujet résolu
    23 février 2017 à 21:51:28

    J'ai un script qui se lance tous les jours pour définir des variables, selon le jour de la semaine (Pour faire de la domotique).

    J'enregistre les variables dans des fichiers textes :

    echo $var1> /home/pi/_var1.txt echo $var2> /home/pi/_var2.txt

    Puis dans les autres script je les récupère

    var1=cat _var1.txt var2=cat _var2.txt

    Il y a t'il une solution plus simple pour éviter de créer pleins de fichier texte ?

    J'ai essayé de faire export $var1 mais impossible de la récupérer dans les autres scripts. Est-il possible de les enregistrer en variable système pour tous les utilisateurs ? Sinon comment faire pour enregistrer toutes les variables dans le même fichier texte?

    Autre problème que j'ai, j'utilise souvent les mêmes commande ou série de commande Par exemple : COUNTPRESENT=$((COUNTPRESENT+1)) && COUNTABSENT=0 && ETAT=PRESENCE && USER=USER1

    Est t'il possible d'enregistrer la commande dans une variable puis de réutiliser plus loin dans le script ? Le top serait de pouvoir réutiliser la variable crée dans d'autre script.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      23 février 2017 à 23:37:58

      salut,

      j'enverrais les variables dans un fichier que je pourrais sourcer par la suite :

      par exemple, dans un script :

      var1=bla
      var2="bla bla"
      
      echo "var1=\"$var1\"
      var2=\"$var2\"" > fichierSource

       et dans un autre :

      . fichierSource
      
      echo "var1 = \"$var1\""
      echo "var2 = \"$var2\""

      enfin :

      $ ./script_1
      $ ./script_2
      var1 = "bla"
      var2 = "bla bla"


      les commandes qui sont répétées dans un script, ou dans le terminal, devraient être inscrites dans une fonction.
      mais pas tel que tu le montres. ça ne constitue pas vraiment une commande, mais une suite d'assignations.

      -
      Edité par dantonq 23 février 2017 à 23:42:05

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        24 février 2017 à 18:38:05

        Merci, Pour le script qui enregistre dans fichierSource ça marche.

        Dans script_2, le . de ". fichierSource" correspondant à quoi exactement? Récupérer toutes les variable du fichier? Identique à la commande source ?

        Par contre comment ajouter de nouvelle variable dans fichierSource à la suite sans écraser celle d'avant ? Pareil pour mettre à jour une variable dans la liste.

        Si j'utilise >> fichierSource il va les rajouter à la suite sans s’occuper si elle existe déjà.

        • Partager sur Facebook
        • Partager sur Twitter
          24 février 2017 à 19:07:00

          oui, ça source le script indiqué, mais source n'est pas POSIX, et puis c'est trop long à écrire. ;)

          ah, il va falloir écrire une 'tite fonction, à exécuter à la fin du script, pour mettre à jour les variables du fichierAsourcer à coup de sed.
          mais bon, si les variables doivent ne servir que dans un seul script, à la rigueur écrase le fichierAsourcer avec toutes les variables du script.

          • Partager sur Facebook
          • Partager sur Twitter

          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

            24 février 2017 à 19:59:10

            Non justement je les utilises dans plusieurs script ou alors il faut que je réenregistre toutes les variables dans le fichier fichierAsourcer a la fin de chaque script. Mais je je rajoute de nouvelle variable je devrait tous modifier. Comment il faudrait faire avec le sed ?

            • Partager sur Facebook
            • Partager sur Twitter
              25 février 2017 à 20:02:15

              pourquoi plusieurs scripts ?

              ils font tous la domotique du même site, et ils ont probablement beaucoup de code en commun.

              je ferais un script avec des fonctions (au lieu de faire plusieurs scripts), que j'appellerais en testant le premier argument du script pour exécuter telle ou telle fonction, ou tel enchainement de fonctions.

              en guise de hors-d'œuvre voici les premières fonctions, qui seront, elles aussi, sourcées dans le script :

              # ./fonctionsAsourcer
              # **fichier à sourcer pour charger les fonctions** #
              getEnv()
              {
                  set | sed -n '/_=/,${/_=/d;/^[[:alpha:]][[:alnum:]]*=/p}'
              }
              updateSource()
              {
                  (
                  while IFS='=' read var val
                  do
                      test -n "$rgx" && rgx="$rgx;s/^\($var=\).*/\1$val/" || rgx="s/^\($var=\).*/\1$val/"
                  done < <(getEnv)
                  sed -i "$rgx" ./fichierAsourcer
                  )
                  diff --old-line-format= --unchanged-line-format= --new-line-format=%L <( sort ./fichierAsourcer) <(getEnv | sort) >> ./fichierAsourcer
              }

              deux scripts de test :

              #!/bin/bash
              #script1
              
              . ./fonctionsAsourcer
              . ./fichierAsourcer
              
              var1S1=$1
              var2S1="bla bla"
              ar=( mlk poi )
              ar[2]=nbv
              ar=( "${ar[@]}" [2]='kjh' )
              
              updateSource
              #!/bin/bash
              # scritp2
              
              . ./fonctionsAsourcer
              . ./fichierAsourcer
              
              var1S2=$1
              var2S2="bla bla"
              ar=( fgh poi )
              ar[2]=nbv
              
              updateSource

              et le test :

              $ ./script1 $RANDOM; echo '--'; cat fichierAsourcer 
              --
              ar=([0]="mlk" [1]="poi" [2]="kjh")
              var1S1=28690
              var2S1='bla bla'
              var1S2='21360 2442'
              var2S2='bla bla'
              $ ./script1 $RANDOM; echo '--'; cat fichierAsourcer 
              --
              ar=([0]="mlk" [1]="poi" [2]="kjh")
              var1S1=17756
              var2S1='bla bla'
              var1S2='21360 2442'
              var2S2='bla bla'
              $ ./script2 $RANDOM; echo '--'; cat fichierAsourcer 
              --
              ar=([0]="fgh" [1]="poi" [2]="nbv")
              var1S1=17756
              var2S1='bla bla'
              var1S2=9245
              var2S2='bla bla'
              $ ./script1 $RANDOM; echo '--'; cat fichierAsourcer 
              --
              ar=([0]="mlk" [1]="poi" [2]="kjh")
              var1S1=7823
              var2S1='bla bla'
              var1S2=9245
              var2S2='bla bla'




              -
              Edité par dantonq 25 février 2017 à 21:53:10

              • Partager sur Facebook
              • Partager sur Twitter

              Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                26 février 2017 à 15:33:10

                Ok j'ai tester, je vois le principe, ca enregistre toutes les variable dans fichierAsourcer. Mais si je doit avouer ne ne comprend pas trop le fonctionnent de fonctionsAsourcer, on est plus sur du #!/bin/bash?

                J'ai des erreur avec ceci :

                #!/bin/bash
                #script1
                cd /home/pi/test/
                 
                . ./fonctionsAsourcer
                . ./fichierAsourcer
                 
                var1S1=$1
                url='https://openclassrooms.com/forum/sujet/reutilisation-de-variable-entre-script-2?page=1#message-91537894'
                TEST=TOTO
                var2S1="bla bla"
                ar=( mlk poi )
                ar[2]=nbv
                ar=( "${ar[@]}" [2]='kjh' )
                 
                updateSource



                la variable TEST n'est pas pris en compte, elle est en majuscule?

                Pour m'y retrouver dans mes script j'utilise des non de variable en majuscule pour les communes. (Est-il possible dans fonctionsAsourcer de ne récupérer que les variable en majuscule ?) 

                Pour la variable url j'ai l'erreur suivante, et var1S1 ce duplique

                pi:pi:>~/test $./script1 $RANDOM; echo '--'; cat fichierAsourcer
                sed: -e expression n°1, caractère 73: option inconnue pour `s'
                --
                ar=([0]="mlk" [1]="poi" [2]="kjh")
                var1S1=20216
                var2S1='bla bla'
                url='https://openclassrooms.com/forum/sujet/reutilisation-de-variable-entre-script-2?page=1#message-91537894'
                var1S1=32112
                pi:pi:>~/test $./script1 $RANDOM; echo '--'; cat fichierAsourcer
                sed: -e expression n°1, caractère 73: option inconnue pour `s'
                --
                ar=([0]="mlk" [1]="poi" [2]="kjh")
                var1S1=20216
                var2S1='bla bla'
                url='https://openclassrooms.com/forum/sujet/reutilisation-de-variable-entre-script-2?page=1#message-91537894'
                var1S1=32112
                var1S1=31656






                -
                Edité par cFlavien 26 février 2017 à 15:35:57

                • Partager sur Facebook
                • Partager sur Twitter
                  26 février 2017 à 16:17:37

                  non, c'est tout entier 100% bash complètement. ;)
                  Il n'y a pas de shebang, et le fichier n'a pas besoin d'être exécutable parcequ'il est sourcé dans un script, qui, lui, est interprété par bash, et est lui-même exécutable, ou exécuté en appelant bash.

                  tu n'es pas censé utiliser des noms de variables entièrement en majuscules.
                  par convention, c'est réservé aux variables d'environnement.
                  pour éviter les téléscopages, les variables créées par l'utilisateur doivent avoir un nom en minuscules ou panaché.

                  cependant, ça ne suffit pas à résoudre le problème.
                  si l'initiale est en majuscule, elle est rangée par la commande set parmi les variables d'environnement, au-dessus de _= qui me sert de repère. :(

                  pour les URL, le slash pose problème parce qu'il est utilisé par sed pour séparer les différentes parties de ses commandes.

                  ma solution : ajouter cette ligne val="${val//\//\\/}", sous le do, et avant le test, dans la fonction updateSource.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                    26 février 2017 à 16:31:45

                    Il faudrait que toutes mes variable en majuscule commande par une minuscule. C'est quoi tu tu appelle panaché?

                    Si je les renomme par exemple la variable TEST  en varTEST, elle ne sera plus considérer comme système.

                    Dans ce il serait possible pour fonctionsAsourcer de n'enregistrer dans fichierAsourcer que les variable qui commence par var?

                    -
                    Edité par cFlavien 26 février 2017 à 16:41:59

                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 février 2017 à 16:42:13

                      un panaché est un mélange, donc que les noms ne soient pas entièrement en majuscules; avec une restriction, dans le cas présent, que les noms doivent ne pas commencer par une majuscule.

                      en effet, tu peux adapter la fonction getEnv pour qu'elle ne conserve que les variables dont le nom commence par var_

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                        26 février 2017 à 17:04:12

                        Il faut modifier après le "sed -n".

                        Je ne vois pas comment faire , et le sed je ne sais pas comment l'interpréter o_O

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 février 2017 à 17:32:11

                          à la rigueur, tu peux la laisser telle quelle est.
                          ainsi construite :

                          /_=/,$ #cherche entre le motif _= et la fin de l'entrée

                          { #groupe de commandes

                          /_=/d #supprime la ligne contenant ce motif

                          /^[[:alpha:]][[:alnum:]]*=/p #affiche les lignes qui commencent par une lettre suivie de lettres et/ou de chiffres, ou pas, puis le signe égal.
                          à la place, tu pourrais mettre
                          /^var_[[:alnum:]_]*=/p #afficher les lignes qui commencent par var_ suivi par lettre(s)/chiffre(s) ou soulignement, ou pas.

                          } #fin groupe

                          àmha, c'est superflu : contente-toi de réécrire les noms des variables de telle sorte qu'ils ne commencent pas par une majuscule.
                          il faut prendre soin d'indiquer cette spécificité dans le commentaire de description au début du script.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                            26 février 2017 à 18:24:05

                            Tres bien merci, ça marche comme je veux. Je vais voir ce qui sera le plus simple par rapport à mes script.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Réutilisation de variable entre script

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown