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. 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
    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. Modérateur
        chez moi ça marche
        affiche le resultat de la commande
        sh -x ton_script
        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
            Encore une chose

            au lieu de `cat /etc/passwd | cut -d: -f1`
            tu peux utiliser
            $(cat /etc/passwd | cut -d: -f1)
            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
              }