Forum Programmation.autre Conseil script bash : script automatique d'analyse d'HDD/SSD sur PC

Posté par  . Licence CC By‑SA.
Étiquettes :
1
19
sept.
2024

Bonjour,

J'ai déjà un script bash sous debian bookworm.

Il a pour but de regarder certain paramètres d'intérêt de la table SMART des HDD et SSD.

Je l'ai doté d'une boucle for pour parcourir l'ensemble des périphériques type disk sur un PC.

/dev/sda
/dev/sdb
...

J'observe malheureusement que je n'ai qu'un élément dans le tableau que je récupère.

declare -a disk=$(lsblk -l -d -p -n -o NAME,TYPE | awk '($2=="disk"){print $1}')
echo "${#disk[@]}"

for d in "${disk[@]}"
do
    echo "COMMENCEMENT"
    echo "$d"
    DISK=$d
    DISK_sub="$(basename $d)"

    TYPE="$(smartctl -a $DISK | grep 'Rotation Rate:' | awk '{print $3$4$5}')"

    if [ "$TYPE" = "SolidStateDevice" ]; then

    elif [ "$TYPE" != "SolidStateDevice" ]; then

    fi
done
exit 0

Auriez-vous un conseil vis à vis de ce besoin ?

Script entier

Merci beaucoup

  • # Variable

    Posté par  . Évalué à 3.

    Si tu attaques ta variable en utilisant :

    ${disk} au lieu de ${disk[@]}

    cela devrait fonctionner :)

    • [^] # Re: Variable

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

      et un peu de mise en forme pour agrémenter la (re-)lecture, avec ```bash au début (tu peux éditer ton entrée de forum), comme ça cela présentera quasiment comme sur pastebin :

      declare -a disk=$(lsblk -l -d -p -n -o NAME,TYPE | awk '($2=="disk"){print $1}')
      echo "${#disk[@]}"
      
      for d in "${disk[@]}"
      do
          echo "COMMENCEMENT"
          echo "$d"
          DISK=$d
          DISK_sub="$(basename $d)"
      
          TYPE="$(smartctl -a $DISK | grep 'Rotation Rate:' | awk '{print $3$4$5}')"
      
          if [ "$TYPE" = "SolidStateDevice" ]; then
      
          elif [ "$TYPE" != "SolidStateDevice" ]; then
      
          fi
      done
      exit 0

      declare c'est nouveau en bash ? (jamais utilisé…)

      man bash m'indique :

      Un tableau indicé est créé automatiquement si une variable quelconque est affectée en utilisant la syntaxe nom[indice]=valeur. L'indice est traité comme une expression
      arithmétique et doit s'évaluer en un nombre. declare -a nom permet de déclarer explicitement un tableau indicé (consultez COMMANDES INTERNES DE L'INTERPRÉTEUR ci-des‐
      sous). declare -a nom[indice] est aussi accepté ; l'indice est ignoré.

      Les tableaux associatifs sont créés en utilisant declare -A nom.

      Des attributs peuvent être indiqués pour une variable tableau en utilisant les commandes internes declare et readonly. Les attributs s'appliquent à tous les éléments
      d'un tableau.

      pfiou, va falloir que je relise attentivement le man, j'y vois d'autres nouveautés (pour moi… dès les variables de l'interpréteur o_O)

      bon, concrètement : $disk[@] contient
      "/dev/sda\n/dev/sdb" (donc deux lignes, 1 seul élément, ce qu'affiche correctement echo ${#disk[@]} : 1)

      et pour ta boucle, comme il y a un retour chariot, j'utilise plutôt la forme :

      echo ${disk[@]} | while read d ;
           do
              echo "disque $d"
           done

      avec une boucle while… j'ai jamais trop aimé les for :p

      • [^] # Re: Variable

        Posté par  . Évalué à 2.

        Je ne connaissais pas non plus declare, j'essaye de faire au plus simple généralement même si il très facile de se compliquer la vie avec bash.

        #!/usr/bin/env bash
        
        IFS=$'\n'
        for DISK in $(lsblk -l -d -p -n -o NAME,TYPE | awk '($2=="disk"){print $1}')
        do
            echo "COMMENCEMENT"
            echo "$DISK"
        done

        C'est ce que je fais généralement pour parcourir un retour de commande sur plusieurs lignes, ça fonctionne mais ça pose peut être des soucis dans des cas spécifiques que je ne connais pas car je n'ai qu'une utilisation limitée des scripts bash.
        Si c'est le cas et qu'il y a un spécialiste dans le coin ca m'intéresse beaucoup d'en savoir plus.

        • [^] # Re: Variable

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

          ça pose peut être des soucis dans des cas spécifiques

          moui, redéfinir l'IFS ça pourrait éviter que le for prenne des espaces comme un séparateur…
          ce pour quoi je préfère le while read qui travaille ligne à ligne : si tu oublies que tu as redéfini IFS, tu peux avoir des soucis plus bas dans ton script dans une commande qui s'appuierait sur sa valeur habituelle…

          • [^] # Re: Variable

            Posté par  . Évalué à 2. Dernière modification le 19 septembre 2024 à 17:28.

            Effectivement je le set systématiquement avant un for dans mes scripts autrement, dans un script à modifier il vaut mieux penser à redéfinir l'ancienne valeur juste après pour éviter les soucis.

            Le while read me parait aussi tout à fait adapté.

Suivre le flux des commentaires

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