Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/03/2014, à 10:25

Little Nooby

[Résolu] fdisk -l, assigner output à une variable

Bien le bonjour,

[Introduction - facultatif]
J'ai récemment coder un script dont le but est de détecter la connexion d'un disque dur externe sur mon raspberry pi (ou n'importe quelle autre machine et ceci afin de coder un interrupteur pour créer un réveil matin sur mon pi). Pour rendre le script le script plus général, il détecte la moindre détection d'un changement au niveau des périphériques (ajout/enlèvement). Pour le moment je code sur mon portable et je me frotte à un problème assez bizarre. J'ai su le contourner, soit, mais d'une manière assez dégueulasse.

[Le cœur du problème]
Voici un code qui fonctionne :
(Script à lancer en tant qu'administrateur.

#!/bin/bash


fdisk -l 2>/dev/null |wc -l > state1
fdisk -l 2>/dev/null |wc -l > state2

echo "Entering barrier"
# Put or remove any peripheral of the device running this script to end it.

while [ `cat state1` -eq `cat state2` ]; do
  sleep 1s
  fdisk -l 2>/dev/null |wc -l > state2
done

rm state1 state2
echo "Barrier is passed, time to do some action"

Et voici un code qui ne fonctionne pas... :

#!/bin/bash

state1=fdisk -l 2>/dev/null |wc -l
state2=fdisk -l 2>/dev/null |wc -l

echo "Entering barrier"
# Put or remove any peripheral of the device running this script to end it.

while [ $state1 -eq $state2 ]; do
  sleep 1s
  state2=fdisk -l 2>/dev/null |wc -l
done

echo "Barrier is passed, time to do some action"

Le script chez moi affiche 24 en boucle, puis 34 quand je branche une clef usb puis de nouveau 24 quand je l'enlève. On dirait qu'il ne modifie jamais la valeur de la variable et que c'est donc pour ça qu'il bloque dans la boucle.

[Help ?]
Mes questions sont; Avez-vous une idée de pourquoi le deuxième code ne fait pas le résultat attendu? Si oui, comment se restreindre aux variables?

Merci de toute l'aide que vous pourrez m'apporter.


Bonne journée,

Little Nooby

Dernière modification par Little Nooby (Le 09/03/2014, à 16:44)

Hors ligne

#2 Le 08/03/2014, à 10:32

Postmortem

Re : [Résolu] fdisk -l, assigner output à une variable

Salut,
Pour mettre le résultat d'une commande dans une variable :

variable=$(commande)

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 08/03/2014, à 13:06

Little Nooby

Re : [Résolu] fdisk -l, assigner output à une variable

Merci !

Bon, vu la simplicité de la réponse, je suppose que cela veut dire que je vais devoir lire un tutoriel sur le bash un peu plus complet :-D.

Hors ligne

#4 Le 08/03/2014, à 14:52

serged

Re : [Résolu] fdisk -l, assigner output à une variable

Postmortem a écrit :

Salut,
Pour mettre le résultat d'une commande dans une variable :

variable=$(commande)

Ou :

variable=`commande`

(attention quote inversée (`) (AltGr-7 sur clavier français)


LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#5 Le 08/03/2014, à 17:03

Little Nooby

Re : [Résolu] fdisk -l, assigner output à une variable

Merci,

Je suis à peu près sur d'avoir testé les ``, ça marchait pas avant oO. J'ai du me planter ailleurs avec cette version.

Sinon pour les curieux, ça donne ça maintenant :

#!/bin/bash
#===============================================================================
#
#          FILE:  checkstop.sh
# 
#         USAGE:  ./checkstop.sh 
# 
#   DESCRIPTION:  check every one second the state of a switch. When its state is different from the very first check, it runs a script supposed to stop the alarm clock.
# 
#       OPTIONS:  ---
#  REQUIREMENTS:  First argument has to be a script returning the state of a switch. It checks its state every one second. When the user triggers the switch, it runs the script specified as second argument.
#          BUGS:  ---
#         NOTES:  This script is part of alarmScript
#        AUTHOR:  ---
#       COMPANY:  ---
#       VERSION:  1.0
#       CREATED:  08/03/2014 12:23:17 CET
#      REVISION:  ---
#===============================================================================

#####################
##### Arguments #####
#####################

# First argument has to be a script returning a value which characterize the state of the switch.

# Second argument has to be a script which will be runned when the switch has been triggered.
 
#########################
##### Options Block #####
#########################

# -h, --help          Display this help then exit without doing anything else.
# -v, --verbose       echo information when the script process anything.

#################################
##### Setting options value #####
#################################

verbose=0

while getopts "hv" opt; do
  case $opt in
    h)
      sed -n 1,35p $0 | cat #FLAG:IMPROVE must find more effective way to display help.
      exit $?
      ;;
    v)
      verbose=1
      shift
      ;;
  esac
done

########################
##### Script Block #####
########################

if [ $# -ne 2 ]; then
  while [ true ]; do
    read -p "There should be 2 arguments. Do you wish to display help? [Y/n]" -n 1 -r answer
    echo #newline
    case "$answer" in
      y|Y|"") ./$0 -h
              exit;;
      n|N) echo "Exiting script."
           exit;;
    esac
  done
fi 

#Very first check of the switch
state=$($1)
if [ $verbose -eq 1 ]; then
  echo "Entering barrier."
  time=0
fi 

#Now checking every one second the state of the switch
while [ $state -eq $($1) ]; do
  sleep 1s

  if [ $verbose -eq 1 ]; then
    let 'time = time + 1'
    echo "Waiting since $time seconds."
  fi
done

if [ $verbose -eq 1 ]; then
  echo "Barrier passed, time to run $2."
fi
$2 

D'ailleurs si vous voyez des trucs moches, n'hésitez pas :-D.


Merci encore et bonne journée,

LittleNooby

Hors ligne

#6 Le 08/03/2014, à 18:06

nesthib

Re : [Résolu] fdisk -l, assigner output à une variable

Tu pourrais faire beaucoup plus simple en utilisant udev. Crée un nouveau fichier de configuration dans /etc/udev/rules.d/ et ajoutes-y quelque chose du genre :

ACTION=="add", SUBSYSTEMS=="usb", ATTRS{product}=="Nom de la clé" \
    RUN+="commande arguments… &"

Pour voir les événements tu peux lancer la commande :

udev monitor

Pour avoir des infos sur ton périphérique :

udev info -a -p /sys/bloc/sdX

où sdX est l'identifiant de ton disque.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne