#1 Le 27/04/2011, à 16:53
- Christophe C
récupérer label et N° de disque dans une variable.
Bonjour,
Je me met au bash tout doucement. J'ai creusé les if, les case, un peu les boucles, pas mal zénity, mais je reste assez limité en terme de niveau. Mon script de travail, qui me sert entre autre à tester mes compétences, est un script qui chroot mes partitions de test (lubuntu, hybride et natty) pour les mises à jour. Il marche très bien, mais j'essaie de l'améliorer, pour m'améliorer.
Aujourd'hui voila ce que le bout du script que j'utilise pour définir la partition à monter (avant de la chrooter) :
Note : lubuntu, hybride et unity sont des étiquettes que j'ai donné à mes partitions via gparted.
#!/bin/bash
# ----------------------------------------------------------------------------------
#boite de dialogue ou je choisis la partition à monter
# ----------------------------------------------------------------------------------
partition=`zenity --entry --title="Choix des partitions" --text="Indiquez la partition à monter" lubuntu hybride unity `
case $? in #
1) exit;; # je test si la boite zenity renvoi un code d'annulation (1) ou d'erreur (-1) : dans ce cas j'interromp le script
-1) exit;; # la variable $? est une variable d'environnement automatique qui contient les message d'erreur du système
esac #
#
#
# ------------------------------------------------------------------------------------------------------------------------------------
# génération de la variable "numsda", qui donne le N° de partition du SDA en fonction du choix de partition
# ------------------------------------------------------------------------------------------------------------------------------------
case $partition in
lubuntu) numsda=1;;
hybride) numsda=3;;
unity) numsda=5;;
esac
gksudo mkdir /media/$partition #création du répertoire de montage - gksudo pour mot de passe graphique
sudo mount /dev/sda$numsda /media/$partition
...suite du script...
Ca marche très bien, mais j'ai du mettre en dur dans le code les étiquettes et leurs correspondances SDA. Je voudrais que le script récupère la liste des partitions et des labels, et les passent en variables au script.
Un sudo blkid > toto.txt récupère la liste des partitions avec les info qui m'intéresse. J'ai alors un fichier toto.txt qui comprend ça :
/dev/sda1: LABEL="lubuntu" UUID="131ffdf9-1784-477e-8783-8193d2abf63c" TYPE="ext4"
/dev/sda3: LABEL="hybride" UUID="4052caa8-8d69-40b0-8be9-559adf0bd6bf" TYPE="ext4"
/dev/sda5: LABEL="unity" UUID="d03927f4-d80f-4bbc-ac35-ece42238174a" TYPE="ext4"
/dev/sda6: UUID="ca186b93-92f5-404e-b2eb-4712ff1a4c73" TYPE="swap"
/dev/sdf1: LABEL="Windows 158 Go" UUID="C674312574311A1F" TYPE="ntfs"
/dev/sdf5: UUID="7da78d83-d15a-4c8d-be76-9d2a08103c7a" TYPE="ext4"
/dev/sdf6: UUID="582f2a75-8541-49db-9ee3-e763233e41f9" TYPE="swap"
A noter que si je peut me passer de toto.txt comme intermédiaire, ça me va très bien.
Mais ma vrai question, c'est : comment récupérer les "/dev/sda1", "/dev/sda3",... et leurs LABEL correspondants dans une ou des variables exportables vers mon script, en particulier vers la boite zenity qui me donne le choix de la partition à chrooter ?
Cordialement
Dernière modification par Christophe C (Le 27/04/2011, à 16:55)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#2 Le 27/04/2011, à 16:59
- Hoper
Re : récupérer label et N° de disque dans une variable.
J'ai pas tout lu.. (enfin si, mais très, très vite).
Si j'ai bien compris, tu voudrait pouvoir récupérer automatiquement les devices correspondant à tes labels, c'est ça ?
La commande suivante par exemple remplira la variable DEVICE avec la valeur /dev/sda1 :
DEVICE=`/sbin/blkid | grep 'LABEL="lubuntu"' | cut -d ':' -f1`
Dernière modification par Hoper (Le 27/04/2011, à 17:00)
Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org
Hors ligne
#3 Le 27/04/2011, à 17:16
- Christophe C
Re : récupérer label et N° de disque dans une variable.
Pas tout à fait : je veux récupérer automatiquement la liste des device et des labels existants.
UN blkid |grep ext4 me donne juste la liste des partitions chrootables (donc en éliminant les autres système que ext4), ce qui me convient. Mais ensuite ? Comment en extraire la liste des devices, et la liste des labels, et comment utiliser derrière ?
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#4 Le 27/04/2011, à 17:37
- Hizoka
Re : récupérer label et N° de disque dans une variable.
while read ligne
do
# remise à 0 des variables qui seront utilisées
unset LABEL UUID TYPE sdx autres
# recuperation de : /dev/sdX
sdx=${ligne%%:*}
# suppression du /dev/sdX
autres=${ligne#* }
# Recupération des variables LABEL, UUID, TYPE
eval ${autres}
# Retour
echo "Je m'appelle : ${LABEL:-inconnu} fils de ${UUID} habitant ${sdx} et je suis en forme de ${TYPE}"
done < <(blkid | grep ext4)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#5 Le 27/04/2011, à 21:09
- Christophe C
Re : récupérer label et N° de disque dans une variable.
Merci hizoka !
J'avoue qu'à prime abord, je n'ai rien compris au script. Mais après 1 H 30 sur internet, j'ai fini par comprendre chaque ligne (youpi !). Je l'ai même réécris d'une façon un peu différente, pour bien comprendre.
J'ai juste une question sur la syntaxe sdx=${ligne%%:*}. perso j'aurais fait sdx=${ligne:5:4} (ça marche très bien aussi, d'ailleurs). Tu peut m'expliquer cette syntaxe ? je ne la comprend pas.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#6 Le 27/04/2011, à 22:43
- Hizoka
Re : récupérer label et N° de disque dans une variable.
look : http://abs.traduc.org/abs-fr/
pour ta question :
${chaine%%souschaine}
Supprime la plus grande correspondance de $souschaine à partir de la fin de $chaine.
Donc dans notre cas :
pars de la fin et supprime tout jusqu'au dernier (ou premier du coup, dans le sens normal) ":".
/dev/sda8:.........
=> /dev/sda8
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#7 Le 28/04/2011, à 09:15
- FRUiT
Re : récupérer label et N° de disque dans une variable.
Astucieux le coup du eval dans ce cas, bravo ^^
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#8 Le 28/04/2011, à 10:23
- Christophe C
Re : récupérer label et N° de disque dans une variable.
Oui, c'est une belle arnaque. D'ailleurs j'ai mis un moment à comprendre. Pas évident, mais élégant.
Bon, j'ai finis mon script, grace à hizoka. Il récupère dynamiquement la liste des partitions ext4 avec étiquette (et seulement elles), me les propose en combo box zenity, puis monte la partition que j'ai choisi. Ensuite le script se continue, chroot et met à jour la partition, mais c'est une autre histoire.
Pour ceux que cela intéresse, voici le début du script, jusqu'au montage de la partition :
#!/bin/bash
# ---------------------------------------------------------------------------------------------------------------------
#récupération des partitions AVEC étiquette (LABEL). partitions sans étiquettes pas remontées
# ---------------------------------------------------------------------------------------------------------------------
while read ligne #La fonction read crée la variable "ligne", puis la remplis ligne par ligne grace à l'instruction "done"
do #tant que la boucle trouve une nouvelle ligne, elle s'éxécute. Arrivé au bout des lignes, elle s'interromp.
sdx=${ligne:5:4} # la variable sdx est égale au contenu de "ligne" entre les caractères N°5 et N°5+4 (9)
autres=${ligne:11 } # la variable sdx comprend toute la variable "ligne" à compter du caractère 11.
eval $autres #transforme la variable "autres" en commande, et donc les LABEL="..." ou TYPE=ext4 en variable
nbligne=$(( $nbligne + 1 )) #initialise un compteur donnant le nombre de ligne ou on se trouve à un instant T de la boucle.
table_label[$nbligne]=$LABEL #crée "table_label[x]" à chaque boucle, avec la LABEL de $ligne et l'index [$nbligne] correspondant
table_sdx[$nbligne]=$sdx #Idem pour la variable table "table_sdx[x]", mais avec l'info sur la partition de ce label (Type sda5 ou sda3).
done < <(blkid | grep ext4 | grep LABEL) #blkid donne la liste des partitions. Grep sélectionne celles en ext4 et avec une étiquette (LABEL)
#
#
# -----------------------------------------------------------------------------------------
#boite de dialogue ou je choisis la partition à monter
# -----------------------------------------------------------------------------------------
partition=`zenity --entry --title="Choix des partitions" --text="Veuillez indiquer la partition à monter" ${table_label[*]} `
case $? in #
1) exit;; # je test si la boite zenity renvoi un code d'annulation (1) ou d'erreur (-1) : dans ce cas j'interromp le script
-1) exit;; # la variable $? est une variable d'environnement automatique qui contient les message d'erreur du système
esac #
#
#
# -----------------------------------------------------------------------------------------------------------------------
# génération de la variable "numsda" en fonction du choix de la partition à monter
# -----------------------------------------------------------------------------------------------------------------------
# test pour chaque choix de partition quel est le disque SDA correspondant.
case $partition in
${table_label[1]}) numsda=${table_sdx[1]};;
${table_label[2]}) numsda=${table_sdx[2]};;
${table_label[3]}) numsda=${table_sdx[3]};;
${table_label[4]}) numsda=${table_sdx[4]};;
${table_label[5]}) numsda=${table_sdx[5]};;
esac
#
#
# -----------------------------------------------------------------------------------------------------
# lance la prise de contrôle à distance
# -----------------------------------------------------------------------------------------------------
gksudo mkdir /media/$partition #création du répertoire de montage - gksudo pour mot de passe graphique
sudo mount /dev/$numsda /media/$partition
Dernière modification par Christophe C (Le 28/04/2011, à 14:01)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#9 Le 28/04/2011, à 13:49
- Hizoka
Re : récupérer label et N° de disque dans une variable.
On peut egalement faire ça, mais ça change pas grand chose (économie d'une variable et une commande) :
# remise à 0 des variables qui seront utilisées
unset LABEL UUID TYPE SDX
# Ajout de SDX
ligne="SDX=${ligne}"
# Recupération des variables SDX, LABEL, UUID, TYPE
eval ${ligne}
# Retour
echo "Je m'appelle : ${LABEL:-inconnu} fils de ${UUID} habitant ${SDX%:} et je suis en forme de ${TYPE}"
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne