Aide programme shell

Résolu
Bonsoir,
J'ai un petit souci avec un programme que je dois écrire en shell.
Voici le code :

#!/bin/sh

#********************Liste des utilisateurs**************************

liste_users()

{

echo "Liste des utilisateurs"

for params in `cat /etc/passwd | cut -d: -f1`

do

echo "$params"

done

}

#*****Informations sur un ou plusieurs utilisateurs******************

infos_users()

{

echo "Coordonnées de l'utilisateur dans le système"

who am i

}

#******Liste des processus d'un utilisateur**************************

processus_users()

{

echo "Liste des processus de l'utilisateur"

ps -aux

}

#****************Fonctions répertoire********************************

#********************************************************************

#*****************Vérification du répertoire*************************

verif_rep()

{

echo "Chemin du répertoire :"

read rep

[ -d "$rep" ] && return 0

return 1

}

#*****************Fonction création répertoire***********************

cree_rep()

{

clear

if verif_rep

then echo "$rep existe"

else

if [ ! -z "$rep" ]

then

echo "Création du répertoire $rep"

mkdir -p "$rep"

echo "Répertoire créé"

fi

fi

}

#************Fonction suppression répertoire*************************

Suppr_rep()

{

clear

if verif_rep

then

echo "Suppression du répertoire $rep"

echo "Etes-vous sûr de vouloir supprimer?"

read choix

case "$choix" in

O|o|OUI|oui)

rm -r "$rep"

echo "Répertoire supprimé"

;;

N|n|NON|non)

echo "Suppression annulée"

Menu_principal

;;

*)

erreur

pause

;;

esac

else

echo "$rep inexistant ou n'est pas un répertoire"

erreur

fi

}

#****************Consultation du contenu d'un repertoire************

contenu_rep()

{

clear

if verif_rep

then

ls -l "$rep"

else

echo "$ rep inexistant ou n'est pas un répertoire"

erreur

fi

}

#****************Vérification fichier************************************

verif_fich()

{

echo "Chemin du fichier:"

read nom_fich

N=$(cat $fichier | head -n1 | tr -d'')

if ["$nombre" = "$N"]

then

echo "Fichier existant"

else

echo "Fichier $nom_fich inexistant"

erreur

fi

}

#****************Consultation fichier************************************

Consulte_fich()

{

echo "Chemin du fichier à consulter:"

read nom_fich

if [ -e "$nom_fich" ]

then

cat "$nom_fich"

else

echo "Fichier $nom_fich inexistant"

erreur

fi

}

#****************Modification fichier***************************

Modif_fich()

{

echo "Chemin du fichier à modifier:"

read nom_fich

if [ -e "$nom_fich" ]

then

vi "$nom_fich"

else

echo "Fichier $nom_fich n'existe pas"

erreur

fi

}

#*Détection d'utilisateurs n'ayant pas de répertoire d'accueil************

detect_users()

{

tmp=`cat /etc/passwd | cut -d: -f1,6`

for hash in $tmp

do

login=`echo $hash | cut -d: -f1`

home_dir=`echo $hash | cut -d: -f2`

if [ ! -d $home_dir ]

then

echo "pas de répertoire accueil pour $login"

fi

done

}

#**Test si repertoire utilisateur existant***********************

test_repertoire()

{

if [ -d $HOME ]

then

echo "le repertoire $HOME existe déjà"

erreur

fi

}

#**Test si root lance le script*****************************

test_root()

{

if [ $USER != "root" ]

then

echo "l'utilisateur n'est pas root"

erreur

fi

}

#****************Fonction erreur*****************************************

erreur()

{

echo `date` >> erreur.log

echo ""

}

#******************Fonction permettant de quitter le programme***********

Quitter_programme()

{

echo "Voulez-vous quitter le programme?"

read reponse

case "$reponse" in

O|o|OUI|oui)

break

;;

N|n|NON|non)

Menu_principal

;;

*)

echo "erreur"

erreur

pause

;;

esac

}

#********************Fonction pause****************************

pause()

{

echo "Appuyer sur Entrée"

read touche

}

#**************Sous-menu informations utilisateurs***********************

Sous_menu_utilisateurs()

{

echo "Informations liees aux utilisateurs"

echo "1- Liste des utilisateurs"

echo "2- Informations sur un ou plusieurs utilisateurs"

echo "3- Liste des processus utilisateurs"

echo "4- Retour au menu principal"

echo "Tapez votre choix"

read choix2

case "$choix2" in

1)

echo "1- Liste des utilisateurs"

liste_users

pause

;;

2)

echo "2- Informations sur un ou plusieurs utilisateurs"

infos_users

pause

;;

3)

echo "3- Liste des processus d'un utilisateur"

processus_users

pause

;;

4)

echo "4- Retour au menu principal"

Menu_principal

;;

*)

erreur

pause

;;

esac

}

#**************Sous-menu sur les répertoires et fichiers*****************

Sous_menu_repertoires_et_fichiers()

{

echo "Fonctions sur les répertoires et fichiers"

echo "1- Creation d'un répertoire"

echo "2- Suppression d'un répertoire"

echo "3- Consultation du contenu d'un répertoire"

echo "4- Consultation d'un fichier"

echo "5- Modification d'un fichier sous un éditeur"

echo "6- Retour au menu principal"

echo "Quel est votre choix?"

read choix3

case "$choix3" in

1)

cree_rep

pause

;;

2)

Suppr_rep

pause

;;

3)

contenu_rep

pause

;;

4)

Consulte_fich

pause

;;

5)

Modif_fich

pause

;;

6)

Menu_principal

;;

*)

erreur

pause

;;

esac

}

#*******************Sous-menu autres fonctions***************************

Sous_menu_diverses_fonctions()

{

echo "Autres fonctions"

echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"

echo "2- Test si le repertoire de l'utilisateur existe"

echo "3- Test si l'utilisateur exécutant le script est root"

echo "4- Retour au menu principal"

read choix4

case "$choix4" in

1)

echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"

detect_users

pause

;;

2)

test_repertoire

pause

;;

3)

test_root

pause

;;

4)

Menu_principal

pause

;;

*)

erreur

pause

;;

esac

}

#*****************Menu principal****************

while :

do

clear

#-----------------Affichage du menu-------------

cat << EOT

1- Informations liées aux utilisateurs

2- Fonctions sur les répertoires et fichiers

3- Diverses fonctions

4- Quitter

EOT

#---------------Fin du menu---------------------

echo "Entrer votre choix :"

read choix

case $choix in

1)

Sous_menu_utilisateurs

;;

2)

Sous_menu_repertoires_et_fichiers

;;

3)

Sous_menu_diverses_fonctions

;;

4)

Quitter_programme

;;

*)

erreur

echo "Erreur. Saisissez à nouveau votre choix."

pause

;;

esac

done

Lorsque j'exécute le programme sur le terminal, il me retourne comme erreur :
: commande introuvable
' inattendue 4: erreur de syntaxe près du jeton `
'rojet: line 4: `liste_users()

Alors que la veille, il marchait parfaitement bien.
Enfin, concernant la redirection d'erreur, j'aimerais afficher, en plus de la date, le message d'erreur dans le fichier erreur.log.
Merci de votre aide
Guillaume COLOMBAT

8 réponses

  1. Modérateur
    Salut,

    j'ai testé ton script chez moi et ça marche

    sugestion

    pour
    test_root()
    {
    if [ $USER != "root" ]
    then
    echo "l'utilisateur n'est pas root"
    erreur
    fi
    } 
    Même si dans erreur.log tu as les traces de l'exécutions tu peux quand même affiche à l'écran que "voilà c'est bien le root qui exécute le script"
    test_root()
    {
      if [ $USER != "root" ];then
        echo "l'utilisateur n'est pas root"
        erreur
      else
        echo "l'utilisateur est root"
      fi
    }


    Pour l'erreur dans erreur.log tu peux utiliser une variable

    Par exemple
    *)
      msg="Erreur.Saisissez à nouveau votre choix"
      erreur
      echo $msg
      pause
    ;;
    La fonction erreur
    #****************Fonction erreur*****************************************
    
    erreur()
    {
      echo `date` $msg >> erreur.log
      echo ""
    }
    et la partie qui vérifie si l'utilisateur qui exécute le script et root
    #**Test si root lance le script*****************************
    
    test_root()
    {
      msg="l'utilisateur n'est pas root"
    
      if [ $USER != "root" ];then
        echo $msg
        erreur
      else
        echo "l'utilisateur est root"
      fi
    }
    1. Modérateur
      Encore une chose

      au lieu de `cat /etc/passwd | cut -d: -f1`
      tu peux utiliser
      $(cat /etc/passwd | cut -d: -f1)
      1. Salut lami20j!
        Merci beaucoup pour ta réponse.
        C'est tout de même bizarre que ça ne fonctionne pas chez moi.
        D'après toi, d'où ça peut venir?
        Bref, avec ce que tu as mis, j'ai donc modifié le script :

        #!/bin/sh

        #********************Liste des utilisateurs**************************
        liste_users()
        {
        echo "Liste des utilisateurs"
        for params in $(cat /etc/passwd | cut -d: -f1)
        do
        echo "$params"
        done
        }

        #*****Informations sur un ou plusieurs utilisateurs******************
        infos_users()
        {
        echo "Coordonnées de l'utilisateur dans le système"
        who am i
        }

        #******Liste des processus d'un utilisateur**************************
        processus_users()
        {
        echo "Liste des processus de l'utilisateur"
        ps -aux
        }

        #****************Fonctions répertoire********************************
        #********************************************************************
        #*****************Vérification du répertoire*************************
        verif_rep()
        {
        echo "Chemin du répertoire :"
        read rep
        [ -d "$rep" ] && return 0
        return 1
        }

        #*****************Fonction création répertoire***********************
        cree_rep()
        {
        clear
        if verif_rep
        then echo "$rep existe"
        else
        if [ ! -z "$rep" ]
        then
        echo "Création du répertoire $rep"
        mkdir -p "$rep"
        echo "Répertoire créé"
        fi
        fi
        }

        #************Fonction suppression répertoire*************************
        Suppr_rep()
        {
        clear
        if verif_rep
        then
        echo "Suppression du répertoire $rep"
        echo "Etes-vous sûr de vouloir supprimer?"
        read choix
        case "$choix" in
        O|o|OUI|oui)
        rm -r "$rep"
        echo "Répertoire supprimé"
        ;;
        N|n|NON|non)
        echo "Suppression annulée"
        Menu_principal
        ;;
        *)
        erreur
        pause
        ;;
        esac
        else
        msg="$rep inexistant ou n'est pas un répertoire"
        echo $msg
        erreur
        fi
        }

        #****************Consultation du contenu d'un repertoire************
        contenu_rep()
        {
        clear
        if verif_rep
        then
        ls -l "$rep"
        else
        msg="$ rep inexistant ou n'est pas un répertoire"
        echo $msg
        erreur
        fi
        }

        #****************Vérification fichier************************************
        verif_fich()
        {
        echo "Chemin du fichier:"
        read nom_fich
        N=$(cat $fichier | head -n1 | tr -d'')
        if ["$nombre" = "$N"]
        then
        echo "Fichier existant"
        else
        msg="Fichier $nom_fich inexistant"
        echo $msg
        erreur
        fi
        }

        #****************Consultation fichier************************************
        Consulte_fich()
        {
        echo "Chemin du fichier à consulter:"
        read nom_fich
        if [ -e "$nom_fich" ]
        then
        cat "$nom_fich"
        else
        msg="Fichier $nom_fich inexistant"
        echo $msg
        erreur
        fi
        }

        #****************Modification fichier***************************
        Modif_fich()
        {
        echo "Chemin du fichier à modifier:"
        read nom_fich
        if [ -e "$nom_fich" ]
        then
        vi "$nom_fich"
        else
        echo "Fichier $nom_fich n'existe pas"
        erreur
        fi
        }

        #*Détection d'utilisateurs n'ayant pas de répertoire d'accueil************
        detect_users()
        {
        tmp=`cat /etc/passwd | cut -d: -f1,6`
        for hash in $tmp
        do
        login=`echo $hash | cut -d: -f1`
        home_dir=`echo $hash | cut -d: -f2`
        if [ ! -d $home_dir ]
        then
        echo "pas de répertoire accueil pour $login"
        fi
        done
        }

        #**Test si repertoire utilisateur existant***********************
        test_repertoire()
        {
        if [ -d $HOME ]
        then
        echo "le repertoire $HOME existe déjà"
        erreur
        fi
        }

        #**Test si root lance le script*****************************
        test_root()
        {
        msg="l'utilisateur n'est pas root"
        if [ $USER != "root" ];
        then
        echo $msg
        erreur
        else
        echo "l'utilisateur est root"
        fi
        }

        #****************Fonction erreur*****************************************
        erreur()
        {
        echo `date` $msg >> erreur.log
        echo ""
        }

        #******************Fonction permettant de quitter le programme***********
        Quitter_programme()
        {
        echo "Voulez-vous quitter le programme?"
        read reponse
        case "$reponse" in
        O|o|OUI|oui)
        break
        ;;
        N|n|NON|non)
        Menu_principal
        ;;
        *)
        msg="erreur"
        erreur

        echo $msg
        pause
        ;;
        esac
        }

        #********************Fonction pause****************************
        pause()
        {
        echo "Appuyer sur Entrée"
        read touche
        }

        #**************Sous-menu informations utilisateurs***********************
        Sous_menu_utilisateurs()
        {
        echo "Informations liees aux utilisateurs"

        echo "1- Liste des utilisateurs"
        echo "2- Informations sur un ou plusieurs utilisateurs"
        echo "3- Liste des processus utilisateurs"
        echo "4- Retour au menu principal"
        echo "Tapez votre choix"
        read choix2

        case "$choix2" in
        1)
        echo "1- Liste des utilisateurs"
        liste_users
        pause
        ;;
        2)
        echo "2- Informations sur un ou plusieurs utilisateurs"
        infos_users
        pause
        ;;
        3)
        echo "3- Liste des processus d'un utilisateur"
        processus_users
        pause
        ;;
        4)
        echo "4- Retour au menu principal"
        Menu_principal
        ;;
        *)
        erreur
        pause
        ;;
        esac
        }

        #**************Sous-menu sur les répertoires et fichiers*****************
        Sous_menu_repertoires_et_fichiers()
        {
        echo "Fonctions sur les répertoires et fichiers"

        echo "1- Creation d'un répertoire"
        echo "2- Suppression d'un répertoire"
        echo "3- Consultation du contenu d'un répertoire"
        echo "4- Consultation d'un fichier"
        echo "5- Modification d'un fichier sous un éditeur"
        echo "6- Retour au menu principal"
        echo "Quel est votre choix?"

        read choix3
        case "$choix3" in
        1)
        cree_rep
        pause
        ;;
        2)
        Suppr_rep
        pause
        ;;
        3)
        contenu_rep
        pause
        ;;
        4)
        Consulte_fich
        pause
        ;;
        5)
        Modif_fich
        pause
        ;;
        6)
        Menu_principal
        ;;
        *)
        erreur
        pause
        ;;
        esac
        }

        #*******************Sous-menu autres fonctions***************************
        Sous_menu_diverses_fonctions()
        {
        echo "Autres fonctions"
        echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"
        echo "2- Test si le repertoire de l'utilisateur existe"
        echo "3- Test si l'utilisateur exécutant le script est root"
        echo "4- Retour au menu principal"

        read choix4
        case "$choix4" in
        1)
        echo "1- Détection des utilisateurs n'ayant pas un répertoire d'accueil"
        detect_users
        pause
        ;;
        2)
        test_repertoire
        pause
        ;;
        3)
        test_root
        pause
        ;;
        4)
        Menu_principal
        pause
        ;;
        *)
        erreur
        pause
        ;;
        esac
        }

        #*****************Menu principal****************
        while :
        do
        clear
        #-----------------Affichage du menu-------------
        cat << EOT
        1- Informations liées aux utilisateurs
        2- Fonctions sur les répertoires et fichiers
        3- Diverses fonctions
        4- Quitter
        EOT
        #---------------Fin du menu---------------------

        echo "Entrer votre choix :"
        read choix
        case $choix in
        1)
        Sous_menu_utilisateurs
        ;;
        2)
        Sous_menu_repertoires_et_fichiers
        ;;
        3)
        Sous_menu_diverses_fonctions
        ;;
        4)
        Quitter_programme
        ;;
        *)

        msg="Erreur. Saisissez à nouveau votre choix."
        echo $msg
        erreur
        pause
        ;;
        esac
        done

        Dis-moi si ça marche.
        Merci d'avance
        1. Modérateur
          chez moi ça marche
          affiche le resultat de la commande
          sh -x ton_script
          1. Modérateur
            Ca veut dire que ça marche?

            Un petit conseil

            rend ton code plus lisible en utilisant l'indentation

            Par exemple

            sans indentation
            case "$choix3" in
            1)
            cree_rep
            pause
            ;;
            2)
            Suppr_rep
            pause
            ;;
            3)
            contenu_rep
            pause
            ;;
            4)
            Consulte_fich
            pause
            ;;
            5)
            Modif_fich
            pause
            ;;
            6)
            Menu_principal
            ;;
            *)
            erreur
            pause
            ;;
            esac
            } 


            Avec indentation
            case "$choix3" in
                1)
                  cree_rep
                  pause
                ;;
                2)
                  Suppr_rep
                  pause
                ;;
                3)
                  contenu_rep
                  pause
                ;;
                4)
                  Consulte_fich
                  pause
                ;;
                5)
                  Modif_fich
                  pause
                ;;
                6)
                  Menu_principal
                ;;
                *)
                  erreur
                  pause
                ;;
            esac
            1. Le programme fonctionne mais j'ai juste un petit problème concernant la création de répertoire. J'aimerais d'abord vérifier les droits avant de le créer.
              Merci d'avance pour ton aide