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.

#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

Watael a écrit :

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.
~$

sad

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 smile
Par contre , j ' ai un peu de mal à comprendre le tout roll

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 tongue mais OSEF .

Hors ligne

#105 Le 19/03/2025, à 16:51

nany

Re : script pour montage automatique partitions de données

RaphaelG a écrit :

@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

 



iznobe a écrit :

Par contre , j ' ai un peu de mal à comprendre le tout roll

awk -vi=-1 

je ne maitrise pas du tout awk ... deja sed , pas toujours simple ...

On affecte à awk une variable i initialisée à -1.

iznobe a écrit :
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. hmm

iznobe a écrit :

PS , y a un petit defaut pour la valeur " 0 " au choix du numéro de la partition tongue 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

nany a écrit :

Bémol : si une partition a par exemple un label « externe », le champ sera considéré comme vide. hmm

À 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

nany a écrit :
iznobe a écrit :

PS , y a un petit defaut pour la valeur " 0 " au choix du numéro de la partition tongue 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)

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 tongue :

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" }

')

Hors ligne

#109 Le 19/03/2025, à 20:46

nany

Re : script pour montage automatique partitions de données

iznobe a écrit :

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.

iznobe a écrit :

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.

iznobe a écrit :

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.)

iznobe a écrit :

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.

iznobe a écrit :

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.

iznobe a écrit :

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)

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" big_smile

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. hmm
smile


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 tongue


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 ?

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 roll

je te laisse me faire le cours du coup tongue

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)

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 roll
cela change quoi ? car d' apres mes tests , ca a l' air de fonctionner.

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 ?

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. wink


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 !"

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 .

Hors ligne