#101 Le 19/03/2025, à 13:26
- nany
Re : script pour montage automatique partitions de données
Bonjour,
Compte tenu que le champ LABEL peut être vide et en partant de ce que watael a posté en #97, j’ai écrit ceci :
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext" \
{ \
j=0 ; \
if ($2 ~ /^ext/) \
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" } \
else \
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 } \
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
for (( n=0; n<$nbDev; n++ ))
do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
while [ -z "$PartNum" ]
do
read -p "Choisissez le numero correspondant à votre future partition de données : " PartNum
# Si la réponse n’est pas un entier positif
if [[ ! "$PartNum" =~ ^[0-9]+$ ]]
then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
# Si la réponse n’est pas dans le choix proposé
elif ! (( PartNum >= 0 && PartNum <= nbDev )); then
echo "Votre choix doit être compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
Label="${ListPart[$(( PartNum-1 )),1]}"
if [ -z $Label ]
then
echo "La partition « $Part » n’a pas d’étiquette."
else
echo "La partition « $Part » a l’étiquette « $Label »."
fi
Mes deux sous.
Dernière modification par nany (Le 19/03/2025, à 13:32)
En ligne
#102 Le 19/03/2025, à 13:30
- nany
Re : script pour montage automatique partitions de données
PS: tu peux te dispenser de grep :
$ lsblk -o path,label,fstype --filter 'FSTYPE =~ "ext"'
~$ lsblk -o path,label,fstype --filter 'FSTYPE =~ "ext"'
lsblk : l'option « --filter » n'a pas été reconnue
Exécutez « lsblk --help » pour obtenir des renseignements complémentaires.
~$
En ligne
#103 Le 19/03/2025, à 15:08
- RaphaelG
Re : script pour montage automatique partitions de données
Mais pourquoi ne s'intéresser qu'aux systèmes de fichier ext4, ext3 ou ext2 ?
On se prive de fat, XPS ou NTFS. Je ne pense pas que c'était la volonté première d'iznobe.
lsblk possède une sortie "-o type" qui peut prendre les valeurs (entre autres) disk, part et loop. Ce qui nous intéresse, ne serait ce pas le type part ?
Je vous propose :
lsblk -no type,path,fstype,mountpoints,label | awk '
$1 == "part" && $3 != "swap" { printf "%s %s %s %s\n", $2, $3, $4, $5 }'
Après je vous laisse intégrer ça dans un tableau parce que je suis trop nul en bashisme en général et en tableau en particulier.
@nany:
Je pense qu'il y des '\' inutile à l'intérieur de ton awk.
Mes 2 centimes.
Hors ligne
#104 Le 19/03/2025, à 15:41
- iznobe
Re : script pour montage automatique partitions de données
oula ...
@nany , alors effectivement cela fonctionne pile poil
Par contre , j ' ai un peu de mal à comprendre le tout
awk -vi=-1
je ne maitrise pas du tout awk ... deja sed , pas toujours simple ...
if ($2 ~ /^ext/) \ { print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" } \ else \ { print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
quel est l ' intérêt du else ? ( vu que je ne veux traiter que les partitions au format " ext quelquechose " ) .
PS , y a un petit defaut pour la valeur " 0 " au choix du numéro de la partition mais OSEF .
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#105 Le 19/03/2025, à 16:51
- nany
Re : script pour montage automatique partitions de données
@nany:
Je pense qu'il y des '\' inutile à l'intérieur de ton awk.
En effet, alors je reprends :
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext" \
{
j=0 ;
if ($2 ~ /^ext/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
for (( n=0; n<$nbDev; n++ ))
do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
while [ -z "$PartNum" ]
do
read -p "Choisissez le numero correspondant à votre future partition de données : " PartNum
# Si la réponse n’est pas un entier positif
if [[ ! "$PartNum" =~ ^[0-9]+$ ]]
then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
# Si la réponse n’est pas dans le choix proposé
elif ! (( PartNum >= 0 && PartNum <= nbDev )); then
echo "Votre choix doit être compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
Label="${ListPart[$(( PartNum-1 )),1]}"
if [ -z $Label ]
then
echo "La partition « $Part » n’a pas d’étiquette."
else
echo "La partition « $Part » a l’étiquette « $Label »."
fi
Par contre , j ' ai un peu de mal à comprendre le tout
awk -vi=-1
je ne maitrise pas du tout awk ... deja sed , pas toujours simple ...
On affecte à awk une variable i initialisée à -1.
if ($2 ~ /^ext/) \ { print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" } \ else \ { print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
quel est l ' intérêt du else ? ( vu que je ne veux traiter que les partitions au format " ext quelquechose " ) .
C’est traité juste avant et là on regarde si le deuxième champ commence par ext auquel cas c’est le champ fstype car le champ label est vide.
Je vais essayer de traduire le awk en langage humain :
awk avec variable i=-1 'DÉBUT { affiche "declare -A ListPart" } \
si le dernier champ contient "ext" (c’est donc le champ fstype) alors \
{
variable j=0 ;
si le deuxième champ commence par ext alors
{ renseigne le tableau assiociatif avec le champ 1 et un champ vide }
sinon (c’est le champ label non vide)
{ renseigne le tableau assiociatif avec le champ 1 et le champ 2 }
}'
Bémol : si une partition a par exemple un label « externe », le champ sera considéré comme vide.
PS , y a un petit defaut pour la valeur " 0 " au choix du numéro de la partition
mais OSEF .
Je ne comprends pas. Peux-tu préciser ?
En ligne
#106 Le 19/03/2025, à 17:00
- nany
Re : script pour montage automatique partitions de données
Bémol : si une partition a par exemple un label « externe », le champ sera considéré comme vide.
À tester :
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext" \
{
j=0 ;
if ($2 ~ /^ext[2-4]$/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
for (( n=0; n<$nbDev; n++ ))
do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
while [ -z "$PartNum" ]
do
read -p "Choisissez le numero correspondant à votre future partition de données : " PartNum
# Si la réponse n’est pas un entier positif
if [[ ! "$PartNum" =~ ^[0-9]+$ ]]
then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
# Si la réponse n’est pas dans le choix proposé
elif ! (( PartNum >= 0 && PartNum <= nbDev )); then
echo "Votre choix doit être compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
Label="${ListPart[$(( PartNum-1 )),1]}"
if [ -z $Label ]
then
echo "La partition « $Part » n’a pas d’étiquette."
else
echo "La partition « $Part » a l’étiquette « $Label »."
fi
La différence est dans le test du deuxième champ :
if ($2 ~ /^ext[2-4]$/)
soit :
si le deuxième champ est égal à « ext » suivi d’un chiffre entre 2 et 4
La probabilité pour qu’une partition ait un label « ext2 », « ext3 » ou « ext4 » étant alors faible.
Dernière modification par nany (Le 19/03/2025, à 17:04)
En ligne
#107 Le 19/03/2025, à 18:19
- iznobe
Re : script pour montage automatique partitions de données
iznobe a écrit :PS , y a un petit defaut pour la valeur " 0 " au choix du numéro de la partition
mais OSEF .
Je ne comprends pas. Peux-tu préciser ?
c' etait juste pour dire que le retour de ton code d' " origine " est , par exemple chez moi :
1 ⇒ /dev/sda1 Seagate_4T
2 ⇒ /dev/sda3 test
3 ⇒ /dev/sda4 ubuntu_24.04
4 ⇒ /dev/sdb1 WD8
5 ⇒ /dev/sdb2 SAUV
6 ⇒ /dev/sdc3 Data
7 ⇒ /dev/sdd1 WD8PRO1_P1
8 ⇒ /dev/sdd2 WD8PRO1_P2
9 ⇒ /dev/sde1 WD8PRO2
10 ⇒ /dev/nvme0n1p5 LM_21_SSD
11 ⇒ /dev/nvme0n1p6 U_20.04_SSD
12 ⇒ /dev/nvme0n1p7 U_22.budgie_SSD
13 ⇒ /dev/nvme0n1p8 U_24.04_SSD
14 ⇒ /dev/nvme0n1p9 LM_SSD_NEW
15 ⇒ /dev/nvme0n1p10 DEBIAN_XFCE
16 ⇒ /dev/nvme0n1p11 Archlinux
Choisissez le numero correspondant à votre future partition de données :
et que si je tape 0 , il ne traite pas le cas , vu la regex et aussi vu :
for (( n=0; n<$nbDev; n++ ))
do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
mais je suppose , que :
for (( n=0; n<$nbDev; n++ ))
do
echo "$(( n )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
et c' est reglé . un detail de rien du tout , pour ca que je disais " OSEF " .
Par contre bien que fonctionnant parfaitement , la compréhension est pas vraiment facile . Sur que je préfère la version sans la construction du tableau dans le awk ...
Si je suis ton raisonnement , outre le code , le champ vide dans awk est uniquement là pour constituer un nombre de 2 champ par entrée du tableau , que l' on retrouve tout à la fin dans le dernier tronçon de code ( variables Part et Label )?
d' ou le :
nbDev=$(( "${#ListPart[@]}"/2 ))
juste après qui sert pour la boucle ?
je ne comprends pas , pourquoi si un champ est vide , il ne s' ajouterai pas comme les autres ? et donc quel est le réel besoin de faire un if else dans le awk .
Derniere question , a quoi sert la variable : " $NF " , je ne la vois pas reutilisée dans le code ?
Dernière modification par iznobe (Le 19/03/2025, à 19:45)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#108 Le 19/03/2025, à 20:15
- iznobe
Re : script pour montage automatique partitions de données
est ce que cela est envisageable :
list=$(lsblk -no type,path,fstype,uuid,mountpoints,label |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$1 == "part" && $3 != "swap" && $5 != "/" && $5 != "/home" && $5 != "/boot" \
{ print "ListPart["++i","j"]="$1"\nListPart["++i","j"]="$2"\nListPart["++i","j"]="$3"\nListPart["++i","j"]="$4"\nListPart["++i","++j"]="$5"\nListPart["++i","++j"]="$6" }
$NF ~ "/" \
{
j=0 ;
if ($5 ~ /^part$/) # mountpoint et label sont vides :
{ print "ListPart["++i","j"]="$1"\nListPart["++i","j"]="$2"\nListPart["++i","j"]="$3"\nListPart["++i","j"]="$4"\nListPart["++i","j"]=""\nListPart["i","++j"]=""}
else
if ($6 ~ /^part$/) # soit mountpoint , soit label est vide
if ($5 ~ /^\/) # this is a mountpoint
{ print "ListPart["++i","j"]="$1"\nListPart["++i","j"]="$2"\nListPart["++i","j"]="$3"\nListPart["++i","j"]="$4"\nListPart["++i","j"]="$5"\nListPart["i","++j"]=""}
else # this is a label
{ print "ListPart["++i","j"]="$1"\nListPart["++i","j"]="$2"\nListPart["++i","j"]="$3"\nListPart["++i","j"]="$4"\nListPart["++i","j"]=""\nListPart["i","++j"]="$6"}
else # rien n est vide
{ print "ListPart["++i","j"]="$1"\nListPart["++i","j"]="$2"\nListPart["++i","j"]="$3"\nListPart["++i","j"]="$4"\nListPart["++i","j"]="$5"\nListPart["i","++j"]="$6"}
else
{ print "\nListPart["i","++j"]="$6" }
')
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#109 Le 19/03/2025, à 20:46
- nany
Re : script pour montage automatique partitions de données
c' etait juste pour dire que le retour de ton code d' " origine " est , par exemple chez moi :
1 ⇒ /dev/sda1 Seagate_4T … 16 ⇒ /dev/nvme0n1p11 Archlinux Choisissez le numero correspondant à votre future partition de données :
et que si je tape 0 , il ne traite pas le cas , vu la regex
Bah, vu que le choix va de 1 à 16, il n’y a pas de raison de taper 0.
Et, effectivement, il y a un problème si on fait ce choix : la ligne elif doit comparer si le choix est strictement supérieur à 0.
et aussi vu :
for (( n=0; n<$nbDev; n++ )) do echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}" done
mais je suppose , que :
for (( n=0; n<$nbDev; n++ )) do echo "$(( n )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}" done
et c' est reglé .
Non. D’abord il suffirait de mettre simplement $n à la place de $(( n+1 )). Ensuite il faudrait modifier d’autres parties du code un peu plus loin.
un detail de rien du tout , pour ca que je disais " OSEF " .
Bah non, on ne s’en fout pas. Tu as pointé un problème à régler. Donc, voici le code modifié :
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext" \
{
j=0 ;
if ($2 ~ /^ext[2-4]$/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
for (( n=0; n<$nbDev; n++ ))
do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
while [ -z "$PartNum" ]
do
read -p "Choisissez le numero correspondant à votre future partition de données : " PartNum
# Si la réponse n’est pas un entier positif
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]]
then
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
# Si la réponse n’est pas dans le choix proposé
elif ! (( PartNum > 0 && PartNum <= nbDev ))
then
echo "Votre choix doit être compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
Label="${ListPart[$(( PartNum-1 )),1]}"
if [ -z $Label ]
then
echo "La partition « $Part » n’a pas d’étiquette."
else
echo "La partition « $Part » a l’étiquette « $Label »."
fi
(J’en ai profité pour parfaire le test du nombre entier positif du coup on a ceinture et bretelles.)
Par contre bien que fonctionnant parfaitement , la compréhension est pas vraiment facile . Sur que je préfère la version sans la construction du tableau dans le awk ...
Si je suis ton raisonnement , outre le code , le champ vide dans awk est uniquement là pour constituer un nombre de 2 champ par entrée du tableau , que l' on retrouve tout à la fin dans le dernier tronçon de code ( variables Part et Label )?
d' ou le :nbDev=$(( "${#ListPart[@]}"/2 ))
juste après qui sert pour la boucle ?
Tu as bien compris. Je n’ai pas trouvé d’autre moyen de tester les valeurs du tableau associatif.
je ne comprends pas , pourquoi si un champ est vide , il ne s' ajouterai pas comme les autres ? et donc quel est le réel besoin de faire un if else dans le awk .
C’est à cause du séparateur de champs de lsblk (espace ou tabulation) qui fait que, si le champ 2 est vide, le champ 3 prend sa place et devient alors champ 2.
Derniere question , a quoi sert la variable : " $NF " , je ne la vois pas reutilisée dans le code ?
C’est une variable intégrée à awk qui désigne le dernier champ de la ligne.
Dernière modification par nany (Le 19/03/2025, à 20:50)
En ligne
#110 Le 19/03/2025, à 20:59
- Watael
Re : script pour montage automatique partitions de données
NF = total Number of Fields
$NF affiche donc la valeur du dernier champ.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#111 Le 21/03/2025, à 12:09
- iznobe
Re : script pour montage automatique partitions de données
Bon , je pense que c' est pas trop mal .
je " tique " juste sur le fait de devoir refaire la boucle pour le controle d' etiquette ...
un script " test " ( qui ne modifie rien donc ), pour ceux qui veulent s ' amuser un peu et faire des retours :
#!/bin/bash
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
exit
fi
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext" \
{
j=0 ;
if ($2 ~ /^ext[2-4]$/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
for (( n=0; n<"$nbDev"; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
while [ -z "$PartNum" ]; do
read -p "Choisissez le numero correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]]; then # Si la réponse n’est pas un entier positif
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
elif ! (( PartNum > 0 && PartNum <= nbDev )); then # Si la réponse n’est pas dans le choix proposé
echo "Votre choix doit être compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),1]}"
rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
label() {
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données , elle doit être UNIQUE et ne pas contenir d' espace , d' accent , de caractères spéciaux et au maximum 16 caractères :"
read Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do # etiquette deja utilisée ?
if [[ $Label == "${ListPart[$n,1]}" ]]; then
echo "erreur votre etiquette « $Label » est dejà attribuée !"
exit 7
fi
done
}
if [ -z "$PartLabel" ]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
echo -n "Voulez-vous changer l ' etiquette de la partition « $Part » : [O/n] ?"
read Rep
if [ "$Rep" != "n" ]; then
label
else
Label=$PartLabel
fi
done
fi
while [ -z "$Rep2" ]; do
echo -n "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette : « $Label » [O/n] ?"
read Rep2
done
if [ "$Rep2" = "n" ]; then
echo -e "Annulation par l' utilisateur !"
exit 0
elif [ ! -e "$Part" ]; then # vérification que la partition existe bien
echo -e "La partition « $Part » n' existe pas !"
exit 1
elif [ "$(lsblk -no fstype "$Part")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
echo -e "la partition « $Part » n' est pas formatée en EXT4 ! "
exit 2
elif grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab
echo -e "une partition avec etiquette « $Label » est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
exit 3
elif grep -q "^$Part" /etc/mtab; then # verifier si la partition est deja montée
echo -e "La partition « $Part » est déjà montée !"
exit 4
elif (( "$(grep -q "$Label" /etc/fstab)" )); then # verifier si une etiquette du meme nom existe dans le fstab
echo -e "L ' étiquette « $Label » est déjà utilisée dans le fstab !"
exit 5
elif (( "$(grep -q "$(lsblk -no uuid "$Part")" /etc/fstab)" )); then # PartUUID est deja present dans fstab
echo -e "L UUID de la partition est déjà présent dans le fstab !"
exit 6
fi
# construction des éléments :
#e2label "$Part" "$Label"
#mkdir -v /media/"$Label"
#echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
#systemctl daemon-reload
#mount -a 2>/dev/null
#mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
#chown -v "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
#mkdir /media/"$Label"/.Trash-"$SUDO_UID"
#chown -v "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
#chmod -v 700 /media/"$Label"/.Trash-"$SUDO_UID"
echo " Script pour montage de partition de données terminé avec succès !"
EDIT : reflexion faite , vu qu ' on etabli nous meme la liste des partitions possibles , je me demande si on ne peut pas carrément supprimer :
elif [ ! -e "$Part" ]; then # vérification que la partition existe bien
echo -e "La partition « $Part » n' existe pas !"
exit 1
du script .
Dernière modification par iznobe (Le 21/03/2025, à 12:17)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#112 Le 21/03/2025, à 16:52
- Watael
Re : script pour montage automatique partitions de données
for (( n=0; n<"$nbDev"; n++ ))
pas de guillemets, dans le contexte, on sait qu'il s'agit d'une chaîne insécable (un nombre !)
while [ -z ...
positivons : until test -n "$varName"
les déclarations de fonctions se font au début d'un script.
si des variables n'existent pas lors de la déclaration de la fonction, c'est que la fonction est mal utilisée, et devrait prendre des arguments.
if [ "$Rep" != "n" ]
je f(er)ais le contraire : tant que l'utilisateur ne valide pas expressément le choix, je considère qu'il refuse. donc, si "pas explicitement 'Y' ", alors "non", parce qu'on a vite fait d'appuyer sur une autre touche que "n" pour que ça dégénère.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#113 Le 21/03/2025, à 17:13
- iznobe
Re : script pour montage automatique partitions de données
for (( n=0; n<"$nbDev"; n++ ))
pas de guillemets, dans le contexte
cause => shellcheck
if [ "$Rep" != "n" ]
je f(er)ais le contraire :
je m' en doutais , mais du coup comment tu codes :
si c' est y ou Y ou entrée ?
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#114 Le 21/03/2025, à 18:54
- iznobe
Re : script pour montage automatique partitions de données
bon c' est corrigé , mais pour mettre les arguments à la fonction , je n' ai rien compris dans les exemples que j' ai vu sur le net ...
enfin si il faudrait remplacer $Label par $1 à l' intérieur de la fonction , et appeler la fonction de la façon suivante :
label $Label
si j' ai bien suivi , mais par quoi je remplace Label tout court du coup dans la fonction , pas par "1" quand meme ... ca ne marchera jamais , meme pas j' ai testé d' ailleurs
je te laisse me faire le cours du coup
en attendant voici les corrections minimes apportées :
#!/bin/bash
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
exit
fi
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext" \
{
j=0 ;
if ($2 ~ /^ext[2-4]$/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
for (( n=0; n<$nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
while [ -z "$PartNum" ]; do
read -p "Choisissez le numero correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]]; then # Si la réponse n’est pas un entier positif
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
elif ! (( PartNum > 0 && PartNum <= nbDev )); then # Si la réponse n’est pas dans le choix proposé
echo "Votre choix doit être compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),1]}"
rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
label() {
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données , elle doit être UNIQUE et ne pas contenir d' espace , d' accent , de caractères spéciaux et au maximum 16 caractères :"
read Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do # etiquette deja utilisée ?
if [[ $Label == "${ListPart[$n,1]}" ]]; then
echo "erreur votre étiquette « $Label » est dejà attribuée !"
exit 7
fi
done
}
if [ -z "$PartLabel" ]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
echo -n "Voulez-vous changer l ' étiquette de la partition « $Part » : [O/n] ?"
read Rep
if [[ "$Rep" == [YyoO]* ]]; then
label
else
Label=$PartLabel
fi
done
fi
while [ -z "$Rep2" ]; do
echo -n "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » : [O/n] ?"
read Rep2
done
if [[ "$Rep2" == [YyoO]* ]]; then
echo -e "Annulation par l' utilisateur !"
exit 0
elif [ ! -e "$Part" ]; then # vérification que la partition existe bien
echo -e "La partition « $Part » n' existe pas !"
exit 1
elif [ "$(lsblk -no fstype "$Part")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
echo -e "la partition « $Part » n' est pas formatée en EXT4 ! "
exit 2
elif grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab
echo -e "une partition avec etiquette « $Label » est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
exit 3
elif grep -q "^$Part" /etc/mtab; then # verifier si la partition est deja montée
echo -e "La partition « $Part » est déjà montée !"
exit 4
elif (( "$(grep -q "$Label" /etc/fstab)" )); then # verifier si une etiquette du meme nom existe dans le fstab
echo -e "L ' étiquette « $Label » est déjà utilisée dans le fstab !"
exit 5
elif (( "$(grep -q "$(lsblk -no uuid "$Part")" /etc/fstab)" )); then # PartUUID est deja present dans fstab
echo -e "L UUID de la partition est déjà présent dans le fstab !"
exit 6
fi
# construction des éléments :
e2label "$Part" "$Label"
mkdir -v /media/"$Label"
echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
systemctl daemon-reload
mount -a 2>/dev/null
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
chown -v "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
mkdir /media/"$Label"/.Trash-"$SUDO_UID"
chown -v "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -v 700 /media/"$Label"/.Trash-"$SUDO_UID"
echo " Script pour montage de partition de données terminé avec succès !"
Dernière modification par iznobe (Le 21/03/2025, à 18:57)
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#115 Le 21/03/2025, à 21:24
- Watael
Re : script pour montage automatique partitions de données
dans l'ordre :
[[ $rep == [yY] ]]
label() définit $Label, ce n'est pas elle dont je parle, mais ListPart
label() {
declare -n ar=$1
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données , elle doit être UNIQUE et ne pas contenir d' espace , d' accent , de caractères spéciaux et au maximum 16 caractères :"
read Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<${#ar[*]}/2; n++ )); do # etiquette deja utilisée ?
if [[ $Label == "${ar[$n,1]}" ]]; then
echo "erreur votre etiquette « $Label » est dejà attribuée !"
exit 7
fi
done
}
à appeler ainsi : label ListPart (on passe uniquement le nom du tableau, pas le tableau lui-même)
Dernière modification par Watael (Le 21/03/2025, à 21:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#116 Le 21/03/2025, à 21:42
- iznobe
Re : script pour montage automatique partitions de données
Pour $rep , c' était déjà fait .
rien compris pour la fonction et les arguments
cela change quoi ? car d' apres mes tests , ca a l' air de fonctionner.
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#117 Le 21/03/2025, à 22:02
- Watael
Re : script pour montage automatique partitions de données
cela change quoi ?
rien.
c'est dans ma tête : je me suis persuadé qu'une fonction définie avant une variable qu'elle utilise ne pourrait pas le faire, parce qu'au moment de la définition de la fonction la variable n'existe pas encore.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#118 Le 21/03/2025, à 22:07
- iznobe
Re : script pour montage automatique partitions de données
le principe d' une fonction , si j' ai bien suivi , et peu importe ou on la positionne dans le script , c' est qu ' elle est stockée en RAM prete a etre utilisée , puis ensuite , le reste du script est appliqué non ?
enfin , c' est ce que j' ai cru comprendre de mes dernières lecture sur le sujet .
Du coup je peut la mettre tout en haut , mais par " clarté " et compréhension ,je trouvais que juste avant de traiter le label , c' etait pas plus mal .
Du coup je la laisse en l' etat , ou je met le declare et modifie listpart ?
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#119 Le 21/03/2025, à 22:18
- Watael
Re : script pour montage automatique partitions de données
garde ta version,.
par contre, les déclarations se mettent au début d'un script, par convention, comme ça on sait où elles sont; ça évite de parcourir tous le script pour retrouver sa définition.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#120 Le 21/03/2025, à 22:25
- iznobe
Re : script pour montage automatique partitions de données
ok , je le met en 1ere page aussi .
#!/bin/bash
label() {
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données , elle doit être UNIQUE et ne pas contenir d' espace , d' accent , de caractères spéciaux et au maximum 16 caractères :"
read Label
if [[ "$Label" =~ $rgx || "${#Label}" -gt 16 ]]; then
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial ou plus de 16 caractères !"
unset Label
fi
done
for (( n=0; n<"$nbDev"; n++ )); do # etiquette deja utilisée ?
if [[ $Label == "${ListPart[$n,1]}" ]]; then
echo "erreur votre étiquette « $Label » est dejà attribuée !"
exit 7
fi
done
}
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec « sudo » )"
exit
fi
$(lsblk -no path,label,fstype |
awk -vi=-1 'BEGIN { print "declare -A ListPart" } \
$NF ~ "ext" \
{
j=0 ;
if ($2 ~ /^ext[2-4]$/)
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]=" }
else
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
for (( n=0; n<$nbDev; n++ )); do
echo "$(( n+1 )) ⇒ ${ListPart[$n,0]} ${ListPart[$n,1]}"
done
while [ -z "$PartNum" ]; do
read -p "Choisissez le numero correspondant à votre future partition de données : " PartNum
if [[ ! "$PartNum" =~ ^[1-9][0-9]*$ ]]; then # Si la réponse n’est pas un entier positif
echo "Votre choix doit être un nombre entier compris entre 1 et $nbDev."
unset PartNum
elif ! (( PartNum > 0 && PartNum <= nbDev )); then # Si la réponse n’est pas dans le choix proposé
echo "Votre choix doit être compris entre 1 et $nbDev."
unset PartNum
fi
done
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),1]}"
rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]"
if [ -z "$PartLabel" ]; then
echo "La partition « $Part » n’a pas d’étiquette."
label
else
echo "La partition « $Part » a l’étiquette « $PartLabel »."
while [ -z "$Rep" ]; do
echo -n "Voulez-vous changer l ' étiquette de la partition « $Part » : [O/n] ?"
read Rep
if [[ "$Rep" == [YyoO]* ]]; then
label
else
Label=$PartLabel
fi
done
fi
while [ -z "$Rep2" ]; do
echo -n "Voulez-vous procéder au montage maintenant pour la partition « $Part » en y mettant pour étiquette « $Label » : [O/n] ?"
read Rep2
done
if [[ "$Rep2" == [YyoO]* ]]; then
echo -e "Annulation par l' utilisateur !"
exit 0
elif [ ! -e "$Part" ]; then # vérification que la partition existe bien
echo -e "La partition « $Part » n' existe pas !"
exit 1
elif [ "$(lsblk -no fstype "$Part")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
echo -e "la partition « $Part » n' est pas formatée en EXT4 ! "
exit 2
elif grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab
echo -e "une partition avec etiquette « $Label » est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
exit 3
elif grep -q "^$Part" /etc/mtab; then # verifier si la partition est deja montée
echo -e "La partition « $Part » est déjà montée !"
exit 4
elif (( "$(grep -q "$Label" /etc/fstab)" )); then # verifier si une etiquette du meme nom existe dans le fstab
echo -e "L ' étiquette « $Label » est déjà utilisée dans le fstab !"
exit 5
elif (( "$(grep -q "$(lsblk -no uuid "$Part")" /etc/fstab)" )); then # PartUUID est deja present dans fstab
echo -e "L UUID de la partition est déjà présent dans le fstab !"
exit 6
fi
# construction des éléments :
e2label "$Part" "$Label"
mkdir -v /media/"$Label"
echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
systemctl daemon-reload
mount -a 2>/dev/null
mkdir -v /media/"$Label"/"$SUDO_USER"-"$Label"
chown -v "$SUDO_USER": /media/"$Label"/"$SUDO_USER"-"$Label"
mkdir /media/"$Label"/.Trash-"$SUDO_UID"
chown -v "$SUDO_USER": /media/"$Label"/.Trash-"$SUDO_UID"
chmod -v 700 /media/"$Label"/.Trash-"$SUDO_UID"
echo " Script pour montage de partition de données terminé avec succès !"
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#121 Le 21/03/2025, à 22:51
- Watael
Re : script pour montage automatique partitions de données
#!/bin/bash
label() {
local rgx="[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-]" # il y aura peut-être d'autres regex à tester plus tard...
...
}
$(lsblk... | awk ...
{ print "ListPart["++i","j"]="$1"\nListPart["i","++j"]="$2 }
}')
nbDev=$(( "${#ListPart[@]}"/2 ))
Part="${ListPart[$(( PartNum-1 )),0]}"
PartLabel="${ListPart[$(( PartNum-1 )),1]}"
...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#122 Le 22/03/2025, à 08:31
- iznobe
Re : script pour montage automatique partitions de données
Salut , modifié pour la variable locale de regex .
retour COMPLET et utilisable de commande | script montage partition ext4
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne