#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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne