#51 Le 10/03/2025, à 16:40
- iznobe
Re : script pour montage automatique partitions de données
alors , j ' ai fait ca pour éviter les doublons , le cas échéant au lieu de directement ajouté une ligne dans fstab :
LineOccur=$(grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab) # echo $? : trouve pas retourne 1 , trouve retourne 0
if [[ "$(echo "$?")" == "0" ]]; then
else
echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
fi
ca me parait bien plus simple que les autres solutions au final . a coder et à élaborer
En gros : si la ligne qu ' on compte ajouter existe déjà , et bien on n ' ajoute rien au fstab , sinon , on l' ajoute .
Par contre , ca me fait sortir une variable pour rien , comme je l' ai écrit ... c' est pas un script ou la nécessité de la performance est la priorité mais bon , là , c' est pas trop top j ' avoue , mais ca fonctionne parfaitement .
EDIT :
une partition peut etre montée plusieurs fois a plusieurs endroits , c ' est pas grave , par contre je ne sais pas comment reagit le systeme si on essaie de monter plusieurs fois au meme endroit , je vais donc modifier encore pour eviter ce genre de chose aussi .
Donc voici ce qu e j ' ai adopté pour les doublons du au script :
LineOccur=$(grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab) # echo $? : trouve pas retourne 1 , trouve retourne 0
if [[ "$(echo "$(grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab)")" == "0" ]]; then
echo "la partition est deja traitée dans le fichier /etc/fstab , rien n' a donc été modifié dans ce fichier "
else
echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
mount -a 2>/dev/null
systemctl daemon-reload
fi
desolé pour l ' indentation , je suis pas sous ubuntu là
Dernière modification par iznobe (Le 10/03/2025, à 17:01)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#52 Le 10/03/2025, à 16:53
- geole
Re : script pour montage automatique partitions de données
Oui mais si on utilise le script pour modifier le label, cela signifie qu'il n'a pas cette valeur mais une autre. De plus la partition peut être montée sur /mnt/"UUID" (Gnome disk utility) et peut être définie par UUID= ou /dev/disk/by-Label/LLLLLLL
Dernière modification par geole (Le 10/03/2025, à 16:57)
Les grilles de l'installateur https://doc.ubuntu-fr.org/tutoriel/inst … _subiquity
"gedit admin:///etc/fstab" est proscrit, utilisez "pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY xdg-open /etc/fstab" Voir https://doc.ubuntu-fr.org/gedit
Les partitions EXT4 des disques externes => https://forum.ubuntu-fr.org/viewtopic.p … #p22697248
Hors ligne
#53 Le 10/03/2025, à 17:07
- iznobe
Re : script pour montage automatique partitions de données
tout à fait d' accord avec toi @geole .
Tout d' abord , ce script n' est pas censé modifier le label , il y a plein d' outils qui font cela gparted , peut être gnome-disque, et une commande spécifique " e2label " existe ....
si gnome disk utility a été utilisé , par expérience nous avons vu tous 2 plusieurs fois déjà , que c' est avec celui-ci qu ' il faut alors désactivé le montage automatique sous peine de rencontrer des bugs . je le suspecte d' écrire aussi ses modifications dans un autre fichier .
Bref , je ne vais pas m' engager dans ce script a " contrer " un autre logiciel
si l' utilisateur l ' a utilisé pour monter , c' est aussi à lui de l' utiliser pour démonter le cas échéant ...
je ne peux pas prévoir tous les cas de figure , il va de soit que ce script est à faire sur une base " propre " .
Dernière modification par iznobe (Le 10/03/2025, à 17:10)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#54 Le 10/03/2025, à 17:40
- lynn
Re : script pour montage automatique partitions de données
Là, ce n'est plus un marteau pour écraser la mouche mais une masse...
if [[ "$(echo "$?")" == "0" ]]; then
Un peu plus allégé :
if [ $? -eq 0 ]; then ...
ou
if (($?==0)); then ...
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#55 Le 10/03/2025, à 18:01
- iznobe
Re : script pour montage automatique partitions de données
il me semblait bien que c' etait un peu hard cette histoire
Merci @lynn , je modifie .
Mais n ' y aurait il pas un moyen de faire directement le controle avec la commande dans la condition et se passer de la variable LineOccur ?
Dernière modification par iznobe (Le 10/03/2025, à 18:06)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#56 Le 10/03/2025, à 18:16
- iznobe
Re : script pour montage automatique partitions de données
@geole , je pourrais par contre inclure , quelques lignes pour vérifier si cette partition est deja inscrite via son label ou son UID dans le fstab et indiquer à l' utilisateur si c' est le cas et arrêter le script , ca serait peut être pas plus mal ?
Dernière modification par iznobe (Le 10/03/2025, à 18:17)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#57 Le 10/03/2025, à 19:52
- iznobe
Re : script pour montage automatique partitions de données
bon , ca commencer a devenir inbuvable ces if else dans tous les sens .
y a moyen d ' éclaircir encore ca , avec un switch case par exemple ?
#!/bin/bash
if ! id | grep -q "uid=0"; then
echo "Vous devez etre super utilisateur pour lancer ce script ( essayez avec sudo )"
exit 1
fi
while [ -z "$Disk" ]; do
echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
read Disk
done
while [ -z "$PartNum" ]; do
echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
read PartNum
done
rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
read Label
if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]; then
Lab=${BASH_REMATCH[1]}
echo "Label : $Label | Lab : $Lab ."
if [[ "$Label" != "$Lab" ]]; then
echo "le nom de votre étiquette comporte un espace , un accent ou un caractère spécial !"
unset Label
fi
else
echo "le nom de votre étiquette comporte un trop grand nombre de caractères !"
unset Label
fi
done
while [ -z "$Rep" ]; do
echo -n "Voulez-vous procéder au traitement maintenant pour la partition $Disk$PartNum [O/n] ?"
read Rep
done
if [ "$Rep" = "n" ]; then
echo -e "Annulation !"
exit 2
else
Bloc=/dev/"$Disk""$PartNum"
# echo $? : trouve pas retourne 1 , trouve retourne 0
if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien
echo -e "La partition $Bloc n' existe pas !"
exit
fi
grep "$Bloc" /etc/mtab # verifier si la partition est deja montée
if [ "$?" -eq 0 ]; then
echo -e "La partition est déjà montée !"
exit
fi
PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition
grep "$PartUUID" /etc/fstab # PartUUID est deja present dans fstab
if [ "$?" -eq 0 ]; then
echo -e "L UUID de la partition est déjà présent dans le fstab !"
exit
fi
grep "$Label" /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
if [ "$?" -eq 0 ]; then
echo -e "L ' étiquette de la partition est déjà présente dans le fstab !"
exit
fi
grep "LABEL=$Label /media/$Label ext4 defaults" /etc/fstab # verifier si la ligne existe dans le fstab
if [ "$?" -eq 0 ]; then
echo "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
exit
fi
if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
exit
else # construction des éléments :
e2label "$Bloc" "$Label"
mkdir -v /media/"$Label"
echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
mount -a 2>/dev/null
systemctl daemon-reload
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 !"
fi
fi
Dernière modification par iznobe (Le 10/03/2025, à 20:30)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#58 Le 10/03/2025, à 20:33
- nany
Re : script pour montage automatique partitions de données
Mais n ' y aurait il pas un moyen de faire directement le controle avec la commande dans la condition et se passer de la variable LineOccur ?
if grep -q "^LABEL=$Label" /etc/fstab ; then
echo "La partition est déjà traitée dans le fichier /etc/fstab, rien n'a donc été modifié dans ce fichier."
exit
fi
Dernière modification par nany (Le 10/03/2025, à 20:36)
En ligne
#59 Le 10/03/2025, à 20:38
- Watael
Re : script pour montage automatique partitions de données
y a moyen d ' eclaircir encore ca , avec un switch case :
non, parce que tu ne testes pas la même chose.
de plus, test "$(commande)" = 0 n'arrivera jamais, à moins que la commande affiche littéralement 0.
tu confonds ce qu'affiche une commande et son code de retour.
pour "tester" le code de retour d'une commande :
if commande
then
: true
else
: false
fi
c'est tout simple !
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#60 Le 10/03/2025, à 20:51
- iznobe
Re : script pour montage automatique partitions de données
tu confonds ce qu'affiche une commande et son code de retour.
pas du tout je fais bien la difference ...
if commande
then
: true
else
: false
fi
cela merite peut etre un peu plus de contexte , c' est quoi " : true " ? comment je l' utilise , ca revient au meme que de faire :
if [ "$?" -eq 0 ]; then
d' ailleurs pourquoi c' est à l' envers , dans les autres langages , les booléens à ma connaissance c ' est 1 = true et 0 = false ...
Dernière modification par iznobe (Le 10/03/2025, à 20:53)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#61 Le 10/03/2025, à 20:57
- iznobe
Re : script pour montage automatique partitions de données
iznobe a écrit :Mais n ' y aurait il pas un moyen de faire directement le controle avec la commande dans la condition et se passer de la variable LineOccur ?
if grep -q "^LABEL=$Label" /etc/fstab ; then echo "La partition est déjà traitée dans le fichier /etc/fstab, rien n'a donc été modifié dans ce fichier." exit fi
Merci nany
le " ^ " a la meme signification que le " ! " ?
inverse , ou c' est encore autre chose ?
comme justement une " feinte " pour donner le code retour ?
Dernière modification par iznobe (Le 10/03/2025, à 21:00)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#62 Le 10/03/2025, à 21:04
- nany
Re : script pour montage automatique partitions de données
inverse , ou c' est encore autre chose ?
C’est autre chose dans ce cas : ça indique le début de ligne.
En ligne
#63 Le 10/03/2025, à 21:16
- iznobe
Re : script pour montage automatique partitions de données
bon , voilà ou ca en est , faut que je teste les derniers changements pour etre sur , mais on devrait etre pas trop mal et plus clair quand meme :
#!/bin/bash
if ! id | grep -q "uid=0"; then
echo "Vous devez etre super utilisateur pour lancer ce script ( essayez avec sudo )"
exit 1
fi
while [ -z "$Disk" ]; do
echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
read Disk
done
while [ -z "$PartNum" ]; do
echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
read PartNum
done
rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
read Label
if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]; then
Lab=${BASH_REMATCH[1]}
echo "Label : $Label | Lab : $Lab ."
if [[ "$Label" != "$Lab" ]]; then
echo "le nom de votre étiquette comporte un espace , un accent ou un caractère spécial !"
unset Label
fi
else
echo "le nom de votre étiquette comporte un trop grand nombre de caractères !"
unset Label
fi
done
while [ -z "$Rep" ]; do
echo -n "Voulez-vous procéder au traitement maintenant pour la partition $Disk$PartNum [O/n] ?"
read Rep
done
if [ "$Rep" = "n" ]; then
echo -e "Annulation !"
exit 2
else
Bloc=/dev/"$Disk""$PartNum"
# echo $? : trouve pas retourne 1 , trouve retourne 0
if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien
echo -e "La partition $Bloc n' existe pas !"
exit
fi
if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
exit
fi
if grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab
echo -e "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
exit
fi
if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
echo -e "La partition est déjà montée !"
exit
fi
if grep -q "^LABEL=$Label" /etc/fstab; then /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
echo -e "L ' étiquette de la partition est déjà présente dans le fstab !"
exit
fi
PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition
if grep -q "^$PartUUID" /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
else # construction des éléments :
e2label "$Bloc" "$Label"
mkdir -v /media/"$Label"
echo "LABEL=$Label /media/$Label ext4 defaults" >> /etc/fstab
mount -a 2>/dev/null
systemctl daemon-reload
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 !"
fi
fi
merci pour l' explication @nany .
ca ne fonctionnera donc pas pour cet exemple-ci alors :
if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
echo -e "La partition est déjà montée !"
exit
fi
?
Dernière modification par iznobe (Le 10/03/2025, à 21:19)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#64 Le 10/03/2025, à 21:25
- Watael
Re : script pour montage automatique partitions de données
pas du tout je fais bien la difference ...
pas évident, parce ... ah! tu as modifé ton code.
tu n'utilises pas : true, c'était juste pour mettre quelque chose.
d' ailleurs pourquoi c' est à l' envers , dans les autres langages , les booléens à ma connaissance c ' est 1 = true et 0 = false ...
je ne sais pas.
cependant, il n'y a qu'un seul succès (0), mais plusieurs erreurs possibles (1<=ERR<=255)
"les autres langages", tu as des exemples ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#65 Le 10/03/2025, à 21:33
- nany
Re : script pour montage automatique partitions de données
merci pour l' explication @nany .
ca ne fonctionnera donc pas pour cet exemple-ci alors :
if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée echo -e "La partition est déjà montée !" exit fi
?
A priori si puisque $Bloc est censé être en début de ligne dans mtab.
En ligne
#66 Le 10/03/2025, à 22:05
- Watael
Re : script pour montage automatique partitions de données
Bloc=/dev/$Disk$PartNum'servent à rien les guillemets.
l'arrêt d'un script par décision de l'utilisateur n'est pas une erreur => exit 0
le systemctl daemon-reload doit être effectué avant mount -a
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#67 Le 10/03/2025, à 22:22
- iznobe
Re : script pour montage automatique partitions de données
"les autres langages", tu as des exemples ?
en php , par exemple .
while (1) # = while (true )
{
echo $i;
$i ++;
}
donne une boucle infinie .
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#68 Le 10/03/2025, à 22:37
- iznobe
Re : script pour montage automatique partitions de données
Voilà ce que ça dis , après les vos dernières remarques :
+ renumérotation des erreurs
+ suppression des " en trop
+ correction des conditions
+ ajout des tests pour vérifier que la partition n' est pas déjà placée en fstab
+ inversion reload <=> mount -a
#!/bin/bash
if ! id | grep -q "uid=0"; then
echo "Vous devez etre super utilisateur pour lancer ce script ( essayez avec sudo )"
exit 1
fi
while [ -z "$Disk" ]; do
echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
read Disk
done
while [ -z "$PartNum" ]; do
echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
read PartNum
done
rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
read Label
if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]; then
Lab=${BASH_REMATCH[1]}
echo "Label : $Label | Lab : $Lab ."
if [[ "$Label" != "$Lab" ]]; then
echo "le nom de votre étiquette comporte un espace , un accent ou un caractère spécial !"
unset Label
fi
else
echo "le nom de votre étiquette comporte un trop grand nombre de caractères !"
unset Label
fi
done
while [ -z "$Rep" ]; do
echo -n "Voulez-vous procéder au traitement maintenant pour la partition $Disk$PartNum [O/n] ?"
read Rep
done
if [ "$Rep" = "n" ]; then
echo -e "Annulation !"
exit 0
else
Bloc=/dev/$Disk$PartNum
# echo $? : trouve pas retourne 1 , trouve retourne 0
if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien
echo -e "La partition $Bloc n' existe pas !"
exit 1
fi
if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
exit 2
fi
if grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab
echo -e "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
exit 3
fi
if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
echo -e "La partition est déjà montée !"
exit 4
fi
grep "$Label" /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
if [ "$?" -eq 0 ]; then
echo -e "L ' étiquette de la partition est déjà utilisée dans le fstab !"
exit 5
fi
PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition
grep "$PartUUID" /etc/fstab # PartUUID est deja present dans fstab
if [ "$?" -eq 0 ]; then
echo -e "L UUID de la partition est déjà présent dans le fstab !"
exit 6
else # construction des éléments :
e2label "$Bloc" "$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 !"
fi
fi
Dernière modification par iznobe (Le 10/03/2025, à 22:39)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#69 Le 10/03/2025, à 22:50
- Watael
Re : script pour montage automatique partitions de données
Watael a écrit :"les autres langages", tu as des exemples ?
en php , par exemple .
while (1) # = while (true ) { echo $i; $i ++; }
donne une boucle infinie .
en shell aussi :
while ((1))
pourtant le code de retour des parenthèses est 0 :
((1)); echo $?
0
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#70 Le 10/03/2025, à 23:00
- iznobe
Re : script pour montage automatique partitions de données
ok , donc pour les booléens , c' est pareil que dans les autres langages.
le code retour commande success est à 0 si true et à autre si false ... faut que j' arrête les abus de langages , mais pas que , j ' ai l' impression
En tout cas , merci c' est quand même plus clair tout ca
Dernière modification par iznobe (Le 10/03/2025, à 23:01)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#71 Aujourd'hui à 14:30
- RaphaelG
Re : script pour montage automatique partitions de données
Ah mince ! J'avais raté ce fil. Allez vite j'y vais de 2 petites remarques :
1) Avec la commande id, il y a l'option -u pour n'afficher que le user id.
Cela permet d'éviter un pipe grep au tout début de ton script.
if [ `id -u` != 0 ]
then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
exit 1
fi
On peut faire plus explicite avec l'option -n :
if [ `id -un` != "root" ]
then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
exit 1
fi
2) La regex :
La suggestion de sputnick de changer la variable locale LANG aurait du marcher.
Je maîtrise mal le motif [:alnum:] et je vais plutôt utiliser [0-9A-Za-z_-]+
A remarquer que le caractère moins, '-', n'a pas besoin d'être échappé; en le mettant juste devant le closing sqare bracket, bash sait qu'il ne définit pas un intervalle mais qu'il faut prendre sa valeur littérale.
#!/usr/bin/bash
langorigin=$LC_ALL
LC_ALL=C
rgx="([0-9A-Za-z_-]+)"
while [ -z "$Label" ]
do
echo -n "Choisissez l'étiquette (LABEL) de votre partition de données (pas d'espace, d'accent ni de caractère spécial, 16 caractères maximum) "
read Label
if [[ "$Label" =~ $rgx && "${#Label}" -lt 17 ]]
then
Lab=${BASH_REMATCH[1]}
echo "Label : $Label | Lab : $Lab ."
if [[ "$Label" != "$Lab" ]]
then
echo "le nom de votre étiquette comporte un espace, un accent ou un caractère spécial !"
unset Label
fi
else
echo "Le nom de votre étiquette comporte un trop grand nombre de caractères !"
unset Label
fi
done
LC_ALL=$langorigin
unset langorigin
On aurait pu prendre LANG à la place de LC_ALL, ça devrait faire la même chose (pas testé).
A la fin de mon petit script je reviens sur la valeur originale de LC_ALL, pour que dans la suite de ton script les éventuels messages d'erreur s'affichent dans la langue désirée et non pas en anglais.
Mais on peut faire plus simple et éviter l'utilisation de BASH_REMATCH (que je ne connaissais pas).
Il faut construire un motif qui ne touche pas les labels autorisés mais plutôt les labels non autorisés : [^0-9A-Za-z_-]
Il n'y a même pas besoin de répéteurs; il suffit de la présence d'un seul caractère non désiré pour discréditer le label.
Mon script devient alors :
#!/usr/bin/bash
langorigin=$LC_ALL
LC_ALL=C
rgx="[^0-9A-Za-z_-]"
while [ -z "$Label" ]
do
echo -n "Choisissez l'étiquette (LABEL) de votre partition de données (pas d'espace, d'accent ni de caractère spécial, 16 caractères maximum) "
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
else
echo "Label : $Label"
fi
done
LC_ALL=$langorigin
unset langorigin
Hors ligne
#72 Aujourd'hui à 15:06
- iznobe
Re : script pour montage automatique partitions de données
Salut et merci
Il faut construire un motif qui ne touche pas les labels autorisés mais plutôt les labels non autorisés : [^0-9A-Za-z_-]
c' est ce sur quoi j' étais parti au départ , sauf que sans gérer la langue , ça acceptait les caractères accentués ...
dans la gestion du label , j' ai fait 2messages pour l' utilisateur , mais j' aurais pu aussi bien adopté la même approche que toi pour simplifier le code pas testé , mais je suppose que ça doit le faire aussi et pas besoin de modifié la langue :
rgx="([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\-]+)"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
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
else
echo "Label : $Label"
fi
done
EDIT :
Après test , si j' enlève rematch , les espaces ne sont pas gérés . et effectivement si on place le " - " juste avant le crochet final , pas besoin de l' échapper .
pour avoir un truc qui fonctionne , sans changement de langue , et simplifié , nouvelle regex :
rgx="(#.[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\S-]#+)"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
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
else
echo "Label : $Label"
fi
done
Dernière modification par iznobe (Aujourd'hui à 16:06)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#73 Aujourd'hui à 15:27
- iznobe
Re : script pour montage automatique partitions de données
shellcheck :
no ' souçaie ' :
#!/bin/bash
if [ "$(id -u)" != 0 ]
then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
exit 1
fi
warning :
if [ `id -u` != 0 ]
then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
exit 1
fi
$ shellcheck myscript Line 2: if [ `id -u` != 0 ] ^-- SC2046 (warning): Quote this to prevent word splitting. ^-- SC2006 (style): Use $(...) notation instead of legacy backticks `...`. Did you mean: (apply this, apply all SC2006) if [ $(id -u) != 0 ]
$
je croyais que c' etait strictement equivalent pourtant :
"$(cmd)"
et
`cmd`
???
Dernière modification par iznobe (Aujourd'hui à 15:30)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#74 Aujourd'hui à 16:20
- iznobe
Re : script pour montage automatique partitions de données
finalement pour UID root , j ' ai adopté la version de @watael , même si je ne sais pas vraiment ce que ca fait précisément
pour la regex , je préfère éviter de manipuler des variables globales ou système ( rayer la mention inutile , je pense que système est plus approprié vu que globale c' est dans du code mais bon comme le système c' est du code aussi ... )
Bref , pour le moment , j' en suis là :
#!/bin/bash
if ((UID)); then
echo "Vous devez être super utilisateur pour lancer ce script ( essayez avec sudo )"
exit
fi
while [ -z "$Disk" ]; do
echo -n "Choisissez le DISQUE où est votre future partition de données ( déjà formatée en EXT4 ) : "
read Disk
done
while [ -z "$PartNum" ]; do
echo -n "Choisissez le NUMERO de votre future partition de données sur le disque : "
read PartNum
done
rgx="(#.[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_\S-]#+)"
while [ -z "$Label" ]; do
echo -n "Choisissez l ' étiquette ( LABEL ) de votre partition de données ( pas d' espace , d' accent ni de caractères spéciaux , 16 caractères maximum ) "
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
while [ -z "$Rep" ]; do
echo -n "Voulez-vous procéder au montage maintenant pour la partition $Disk$PartNum en y mettant pour étiquette : $Label[O/n] ?"
read Rep
done
if [ "$Rep" = "n" ]; then
echo -e "Annulation !"
exit 0
else
Bloc=/dev/$Disk$PartNum
# echo $? : trouve pas retourne 1 , trouve retourne 0
if [ ! -e "$Bloc" ]; then # vérification que la partition existe bien
echo -e "La partition $Bloc n' existe pas !"
exit 1
fi
if [ "$(lsblk -no fstype "$Bloc")" != ext4 ]; then # vérifier qu ' elle est bien formatée en ext4
echo -e "la partition $Bloc n' est pas formatée en EXT4 ! "
exit 2
fi
if grep -q "^LABEL=$Label /media/$Label ext4 defaults" /etc/fstab; then # verifier si la ligne existe dans le fstab
echo -e "la partition est déjà traitée dans le fichier /etc/fstab , rien n' a donc été modifié !"
exit 3
fi
if grep -q "^$Bloc" /etc/mtab; then # verifier si la partition est deja montée
echo -e "La partition est déjà montée !"
exit 4
fi
grep "$Label" /etc/fstab # verifier si une etiquette du meme nom existe dans le fstab
if [ "$?" -eq 0 ]; then
echo -e "L ' étiquette de la partition est déjà utilisée dans le fstab !"
exit 5
fi
PartUUID=$(lsblk -no uuid "$Bloc") # recuperer l ' UUID de la partition
grep "$PartUUID" /etc/fstab # PartUUID est deja present dans fstab
if [ "$?" -eq 0 ]; then
echo -e "L UUID de la partition est déjà présent dans le fstab !"
exit 6
else # construction des éléments :
e2label "$Bloc" "$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 !"
fi
fi
ca me parait fonctionner comme attendu et être plus lisible du coup.
Dernière modification par iznobe (Aujourd'hui à 16:22)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#75 Aujourd'hui à 16:54
- Watael
Re : script pour montage automatique partitions de données
finalement pour UID root , j ' ai adopté la version de @watael , même si je ne sais pas vraiment ce que ca fait précisément
c'est une simple Évaluation arithmétique :
si $UID vaut 0, alors FAUX.
si $UID est différent de 0, alors VRAI; ce qui est le cas si l'utilisateur n'est pas root (dont l'UID vaut toujours 0).
je croyais que c' etait strictement equivalent pourtant
ça l'est, si tu mets des guillemets !
(warning): Quote this to prevent word splitting.
le problème des "backticks", c'est l'imbrication de Substitutions de commande : on fait sans problème $(commande $(uneAutre) $(etUneAutre $(allezUne2plus))), mais le faire avec des "backticks"... je ne suis pas certain que ce soit possible.
edit: je viens de trouver un exemple (chercher "nested backticks").
ça donnerait ça :
echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
par exemple.
Dernière modification par Watael (Aujourd'hui à 16:57)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne