[mise en forme script] tableau / echo ???

Résolu
Bonjour,

je prépare un script, qui me permet de checker l'état des disques de mes machines (le script n'en est qu'a c'est début), cependant j'aimerais pouvoir lui donner une mise en forme correct, du style:

DISQUE       SERIAL         SMART        I/O ERROR     AGE     RAID     TEMP 
XXXX XXXXXX XXXX XXX XXXXX XXXXX XXXXX
XXXXX XXXX XXXX XXXXX XXXXX XXXXX XXXXX

donc en gros un tableau, bien formatée avec en haut les intitulée et plus bas, les valeurs retournée par les test effectuer par le script

le problème c'est que dans une variable, je ne parvient pas a stocker plus de un espace et donc en plus de ne pas être propre, sa pose soucis, en effet, par exemples les serial des disques ne comporte pas forcement tous le même nombres de caractères, idem pour d'autre valeurs tel que l'age du disque ou autres

j'ai donc voulu me tester au tableau, mais la je ne parviens pas a grand chose, car quand je veut l'afficher, ce dernier le fait ligne par ligne :/ car il semblerais que les tableau en bash soit limités a 1 seule dimension

j'ai aussi tester les tableau associatif, mais la je m'y perd

declare -A tab
tab[0:1]=A
tab[0:2]=B
tab[0:3]=C
tab[0:4]=D
tab[1:1]=E
tab[2:2]=F
tab[3:3]=G
tab[4:4]=H

echo ${tab[@]}

resultat:

F H E D B C A G

si quelqu'un avait des conseil, ou un lien vers un tuto, me permettant de pouvoir étudier le sujet sa serait cool

Merci

6 réponses

  1. visiblement un petit problème avec la balise <code>
    0
    1. Contributeur
      hello
      pour afficher avec une largeur constante, utiliser printf
      $ var="A"
      $ printf "%5s\n" $var
      A
      $ printf "%10s\n" $var
      A
      $ printf "%-10shello\n" $var
      A hello
      $ printf "%10shello\n" $var
      Ahello
      $
      0
      1. A ben j'aurais pas penser a printf :/

        merci sa fonctionne a première vue:

        var="A"
        varb="B"
        printf "%5s" $var
        printf "%10s\n" $varb

        # ./test.sh
        A B
        0
        1. bon faut jouer un peut avec le possitionnement, voila ce que sa donne pour le moment:

          #!/bin/sh
          clear
          printf "%0sDISQUE"
          printf "%16sSERIAL"
          printf "%5sSMART"
          printf "%5sAGE\n"
          # Detection des disques
          SD=$(ls /dev/sd[a-z]) # test la presence des disques de sda a sdz
          SG=$(ls /dev/sg[0-99]) # test la presence des disques de sg0 a sg99
          
          # Lancement des tests pour disques type sdX
          for dd in $SD
          do
          # Recuperation du serial
          serial=$(smartctl -a -d ata $dd | egrep 'Serial' | awk '{ print $3 }')
          # Compte le nombre de caracteres dans le serial
          Tserial=$(echo $serial | wc -c) && (( Tserial = $Tserial -1 ))
          # test smart du disque
          smart=$(smartctl -a -d ata $dd | egrep 'Logged')
          if [ "$smart" = "No Errors Logged" ]
          then
          smart_result="OK"
          else
          smart_result="FAILED"
          fi
          # Nombre d'heure de vie du disque
          age=$(smartctl -a -d ata $dd | egrep 'Power_On_Hours' | awk '{ print $10 }')
          # Affiche des resultats pour le disque
          printf "%0s" $dd
          printf "%20s" $serial
          printf "%10s" $smart_result
          printf "%8s\n" $age
          done
          
          


          DISQUE                SERIAL     SMART     AGE
          /dev/sda            Z2A7QYDJ        OK   22070
          /dev/sdb      TV650BXFG1BS3R        OK     447
          
          0
          1. Contributeur
            Salut,

            On peut groupir aussi ;-))

            $ printf "%s%20s%10s%8s\n" "Disque" "Serial" "Smart" "Age"
            Disque Serial Smart Age
            0
        2. merci, j'avais tester, mais pas réussi, sa fait moins brouillon comme sa
          0
          1. ce problème étant résolut, je clôture, merci pour votre aide ;)
            0