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 27/04/2011, à 17: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, à 17: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, à 17: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, à 18:00)


Mes tutos et coups de gueule :
http://hoper.dnsalias.net/atdc/
Mastodon: @hoper@framapiaf.org

Hors ligne

#3 Le 27/04/2011, à 18: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, à 18: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, à 22: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, à 23:43

Hizoka

Re : récupérer label et N° de disque dans une variable.

look : http://abs.traduc.org/abs-fr/

pour ta question :

http://abs.traduc.org/abs-fr/ch09s02.html a écrit :

${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, à 10: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, à 11: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, à 15: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, à 14: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