Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script bash

    10 janvier 2022 à 19:47:55

    Bonjour dans le cadre d'un projet à l'IUT nous devons récupérer les donnés type JSON d'un capteur d'une des salles de l'IUT puis nous devons utilisés ces données afin de les publiés de facon automatisé dans un tableau sur une page HTML.

    Pour commancer j'ai donc choisi de récuperer ces données et de les mettres dans un .txt:

    #!/bin/bash 

    mosquitto_sub -h iot.iut-blagnac.fr -t iut/bate/etage/E208/temperature >> /home/etud/Desktop/test.txt

    puis une fois les données JSON dans mon fichier txt je souhaite rentré ces valeurs dans des variables et pour cela je dois donc lire une ligne spécifique de mon txt et le mettre dans une variable.

    Voici le script que j'ai utilisé et je n'ai pas réussi car la commande sed ne marche pas dans une variable:

    #!/bin/bash

    for ((i=1;i<=10;i++))

    do

    var$i= sed $i!d /home/etud/Desktop/test.txt

    echo $var$i;

    done

    Cela ne marche pas si vous avez une solution  pour mon script ou alors une solution pour mon projet pour exploiter un JSON plus simple je suis prenneur.

    Merci a ceux qui répondront.

    • Partager sur Facebook
    • Partager sur Twitter
      10 janvier 2022 à 23:10:23

      Bonjour,

      JSON est un langage :)

      Ces pages HTML que tu dois générées, elles seront servies par un serveur web? Tu devrais dans ce cas la plus facilement traiter ton fichier JSON avec un langage serveur comme PHP, Node.js, Python ou tout simplement depuis le client avec un script JavaScript. PHP, Python, Node.js peuvent tous être utilisé pour écrire des scripts comme en Bash à condition que ces langages soient installés (Python l'est par défaut sur certaines distributions Linux).

      Sinon, si il faut un script shell, il existe https://stedolan.github.io/jq/ qui fait ce dont tu as besoin je pense. Et si jq n'est pas autorisé, alors il faudrait plutôt nous dire ce que tu veux faire exactement (avec un fichier d'exemple en entrée et le résultat voulu en sortie).

      Concernant le script, c'est pas top top... Je note quand même de l'effort dans l'idée pour lire un fichier texte ligne par ligne ^^

      • Pour lire un fichier "file" ligne par ligne:
      while read line; do
          echo "$line"
      done < file

      • Si tu fais une boucle et qu'à chaque tour tu initialises une nouvelle variable, alors autant utiliser un tableau:
      declare -a array # Déclaration d'une variable array de type tableau
      for ((i=0; i<10; i++)); do
          array[$i]+="number $i"
      done
      echo "array[0]" # affiche la valeur à l'index 0
      echo "${array[@]}" # affiche tout le tableau
      

      PS: Utilise les balises <code></code> (</>)

      -
      Edité par KoaTao 11 janvier 2022 à 1:37:24

      • Partager sur Facebook
      • Partager sur Twitter
        11 janvier 2022 à 8:03:02

        > "La commande sed ne marche pas dans une variable"

        C'est normal, elle n'a pas de pattes.

        ---

        Une commande produit généralement un texte sur sa sortie standard.

        • Pour mettre ce texte dans un fichier on redirige

        macommande > monfichier

        • Pour mettre ce texte dans une variable du shell on fait

        mavariable=$(macommande)

        Autrefois, on écrivait des "backticks", qu'on voit mal, qu'on confond avec des apostrophes, et qu'on ne peut pas emboîter

        mavariable=`macommande`

        Des goûts et des couleurs. En tout cas ça a l'air de manquer dans la ligne qui fait le sed.

        ---

        A part ça, une boucle sur des numéros de ligne, c'est un bad smell dans un shell script. Traiter ligne par ligne, c'est un moyen de faire quelque chose, mais souvent un mauvais moyen surtout quand on y arrive pas. Si on savait ce qu'il faut faire avec le contenu du fichier, on trouverait peut être une meilleure façon de s'y prendre.

        -
        Edité par michelbillaud 11 janvier 2022 à 8:16:31

        • Partager sur Facebook
        • Partager sur Twitter
          11 janvier 2022 à 20:00:09

          Tout d'abord merci de vos réponse, KoaTao pour t'expliquer ce que je dois réaliser précisément je dois crée avec plusieurs scripts (en bash obligatoirement) qui récupère des données de capteur JSON puis les mettres dans un tableau pour pouvoir calculer une moyenne, le minimum, le maximum puis qui crée une page HTML et qui met automatiquement les valeurs sur celui ci.

          Je me suis rendu compte que ma manière de procéder n'etais pas bonne et trop complexe. J'ai donc opté pour l'utilisation de tableau.

          Malheureusement lorsque je veux ecrire du JSON dans un .txt cela ne marche pas le fichier se crée bien mais il est vide, j'ai aussi essayé de crée un .JSON le fichier reste vide.

          <code ' type="bash"'>#!/bin/bash

          #----------------------------------partie temperature -----------------------------------

          declare -a TabTemperature=()

          for ((i=1;i<=4;i++))

          do

          valeurTemp= mosquitto_sub -h iot.iut-blagnac.fr -u student -P student -t iut/bate/etage2/E208/temperature -C '1' #récuperère la valeur de la température

          echo $valeurTemp                                       

          echo $valeurTemp > "temperatureE208.txt" #cette ligne ci qui me pose problème

          temp=cat temperatureE208.txt | jq '.value' #récupère seulement la valeur dans le JSON

          TabTemperature+=("$temp")

          echo "${temperature[@]}"  #optionnel (juste pour vérif que ca marche bien)

          done</code>

          Mon echo $valeurTemp  affiche bien les données JSON dans mon terminal rien a redire mais lorsque je veux l'ecrire dans un fichier cela ne marche pas.

          Merci d'avance pour vos réponses.

          • Partager sur Facebook
          • Partager sur Twitter

          Script bash

          × 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