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.

#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 sad

#!/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 smile

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