#26 Le 01/01/2020, à 19:55
- kalene
Re : (bash)Demande de conseils pour améliorer Script [Résolu]
Voila les correctifs fait, mais le problème est que maintenant si je refuse de créer le groupe ou l'utilisateur il continue la fonction "changeId()" sur :
sudo "$cmd" "$idName" "$file" &>/dev/null
echo "${id^} $idName is changed"
et ça j'aimerai que non si je refuse de créer un groupe ou un utilisateur
#!/bin/bash
changeId() {
if test "$1" -eq 1; then
id='user'; database='passwd'; cmd='chown'
else
id='group'; database='group'; cmd='chgrp'
fi
read -rp "Enter the $id name: " idName
if [ -z "$idName" ]; then
exit 1
fi
if ! getent "$database" "$idName" &>/dev/null; then
echo "${id^} $idName does not exist"
createNewId "$1" "$idName"
fi
sudo "$cmd" "$idName" "$file" &>/dev/null
echo "${id^} $idName is changed"
}
createNewId() {
if test "$1" -eq 1; then
idAdd=$2; cmdAdd='adduser'
else
idAdd=$2; cmdAdd='groupadd'
fi
read -rp "Do you want create a new user $idAdd ? (y/n): " yn
if [ -z "$yn" ]; then
exit 1
fi
if [[ $yn == @(y|yes) ]]; then
sudo "$cmdAdd" "$idAdd"
echo "User $idAdd create"
return 1
elif [[ $yn == @(n|no) ]]; then return 1
fi
}
while true; do
read -rp "Enter the name of the file to change: " file
if [ -z "$file" ]; then
echo "Insert file pls."
elif [ -f "$file" ]; then
echo "$file selected."
break
else
echo "$file file not found."
fi
done
echo "1. Change user"
echo "2. Change group"
while true; do
read -rp "What do you want to change the USER or GROUP: " choose
case $choose in
'') exit 1 ;;
'1'|'2') changeId "$choose" ;;
*) echo 'Please, choose 1, 2 or leave empty.' ;;
esac
done
Dernière modification par kalene (Le 01/01/2020, à 19:56)
Hors ligne
#27 Le 01/01/2020, à 20:10
- Watael
Re : (bash)Demande de conseils pour améliorer Script [Résolu]
je passerais par until* :
until test -f "$file"; do read -rp '... ' file; done
printf '%s\n' "1. change user" "2. change group" "q. quit"
until test -n "$choose"; do read -rp '... ' choose; done
test "$choose" = "q" && exit 0 || changeId $choose
exit 0 parce qu'il n'y a pas d'erreur : le script fait ce qui est prévu; les codes de retours supérieurs indiquent qu'il y a eu un problème.
* je trouve until bien utile, il n'est pas suffisamment utilisé.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#28 Le 01/01/2020, à 20:47
- kamaris
Re : (bash)Demande de conseils pour améliorer Script [Résolu]
Tu n'as pas paramétrisé les messages jusqu'au bout dans createNewId(), faute d'avoir utilisé la variable id.
Par ailleurs, tu peux utiliser les mêmes noms de variable que dans changeId(), puisque les variables ont la même fonction (ça guide le lecteur).
Tu as aussi oublié de positionner l'option shell nocasematch pour que le test sur la réponse de l'utilisateur fonctionne correctement.
Pour arrêter le script en cas de refus de l'utilisateur de créer un nouvel utilisateur ou groupe, tu as deux options : soit tu mets un exit 1 dans createNewId(), ce qui, en intégrant les trois remarques ci-dessus, donnerait :
createNewId() {
if test "$1" -eq 1; then
id='user'; cmd='adduser'
else
id='group'; cmd='groupadd'
fi
read -rp "Do you want create a new $id $2 ? (y/n): " yn
set_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
if [[ $yn == @(y|yes) ]]; then
sudo "$cmd" "$2" && echo "${id^} $2 create"
else exit 1
fi
$set_nocasematch
}
Soit à la place du exit 1 tu mets un return 1, et à ce moment-là, dans changeId(), tu mets
createNewId "$1" "$idName" || exit 1
Toujours dans changeId(), tu peux aussi conditionner l'écriture du message final par la réussite du changement d'utilisateur / groupe en faisant :
sudo "$cmd" "$idName" "$file" && echo "${id^} $idName is changed"
comme le recommande Watael en #24.
Hors ligne
#29 Le 01/01/2020, à 21:17
- kalene
Re : (bash)Demande de conseils pour améliorer Script [Résolu]
Oui mais moi je veux que le script continue et qu'il reparte sur "What do you want to change the USER or GROUP: " sans m’afficher le "${id^} $idName is changed" quand je j'accepte pas la condition. Se qu'il fait déjà la, mais il continue toujours avec
sudo "$cmd" "$idName" "$file" &>/dev/null
echo "${id^} $idName is changed"
Hors ligne
#30 Le 01/01/2020, à 21:20
- kalene
Re : (bash)Demande de conseils pour améliorer Script [Résolu]
j'ai trouvé en mettant ça
createNewId "$1" "$idName" || return 1
Non c'est bon grace à vous je crois que tout est bon maintenant sur ce script
Dernière modification par kalene (Le 01/01/2020, à 21:21)
Hors ligne
#31 Le 01/01/2020, à 21:22
- kamaris
Re : (bash)Demande de conseils pour améliorer Script [Résolu]
Voilà, c'est ce que j'allais te dire
Ça va te faire remonter l'info jusqu'à la boucle while initiale, ensuite il te reste à la gérer là-bas…
Hors ligne
#32 Le 01/01/2020, à 21:30
- kalene
Re : (bash)Demande de conseils pour améliorer Script [Résolu]
Merci à tous pour votre aide ! particulièrement à Kamaris et Watael !!
Hors ligne