Erreur script shell

ennouma_123 Messages postés 5 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
bonjour,
lorsque je veux exécuter le scripte suivant il le terminal m'affiche se msg


voici le scripte:
#!/bin/bash

refus()
{
echo Ne pas interrompre le programme...
}


ajout()
{
read -p"Nom : " nom
read -p"Prenom : " prenom
read -p"Numero de telephone : " tel
read -p"Bureau : " buro
read -p"Service : " serv

echo "$nom:$prenom:$tel:$buro:$serv"
echo "Confirmez-vous ? (o/n)"
read reponse
case "$reponse" in
o|oui) echo "$nom:$prenom:$tel:$buro:$serv" >>$Annuaire
 echo Utilisateur $nom enregistré;;
n|non) echo "Information NON enregistrée"
 ;;
esac

}

eclat()
{
for f in $(cut -d: -f5 $Annuaire | sort -u)
do
grep $f $Annuaire >>$f
done
}

# Debut du programme 

trap "refus" 2 3 15

if [ $# -lt 1 ]
then echo "Syntaxe : $(basename $0) [-opt] Nom_Annuaire" 1>&2; 
 exit 1
fi

eval Annuaire=\${$#}
if [[ ! -e "$Annuaire" || ! -r "$Annuaire" ]]
then echo "\"$Annuaire\" devrait être le nom d'un fichier annuaire lisible"
 exit
fi

if [ $# -eq 1 ]
then sort "$Annuaire"
else
case $1 in

-t) sort -t: -k 5 -k 1 "$Annuaire";;
-T) sort -t: -k 3n "$Annuaire";;
-M) cut -d: -f1 "$Annuaire";;
-d) tail -1 "$Annuaire";;
-m) tr ':' '.' <"$Annuaire" | cut -d. -f1,2;;
-a) ajout;;
-g) if [ $# -ne 3 ] 
 then echo "Syntaxe : $(basename $0) -g nom Nom_Annuaire"  1>&2; 
  exit 1
 else
  grep -i "^[^:]*$2[^:]*:" "$Annuaire"
 fi;;
-e) eclat;;
-s) if [ $# -ne 3 ]
 then    echo "Syntaxe : $(basename $0) -s Nom Nom_Annuaire"  1>&2; 
  exit 1
 else
  if grep "^$2" $Annuaire >/dev/null 2>&1
  then
  grep -v "^$2" $Annuaire >/tmp/ann.$$ 
  mv $Annuaire ${Annuaire}.old
  mv /tmp/ann.$$ $Annuaire
  echo $2 supprime
  else
  echo "L'utilisateur $2 n'est pas inscrit"
  fi
 fi;;
-b) if [ $# -ne 3 ]
 then    echo "Syntaxe : $(basename $0) -b X Nom_Annuaire" 1>&2; 
  exit 1
 else
  grep "^[^:]*:[^:]*:[^:]*:$2.*:" $Annuaire | cut -d: -f1|sort
 fi;;


*) echo "Option ($1) inconnue";exit;;
esac
fi


merci d'avance.......

5 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Donne les droits en exécution à ton fichier et exécute le sans
    bash
    :

    chmod a+x annuaire.sh
    ./annuaire.sh


    Bonne chance
    1
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour,

    Inutile de faire des captures d'écran, un simple copier coller suffit et sera plus pratique te plus écologique. Pour commencer indente mieux ton fichier pour le rendre plus lisible :

    #!/bin/bash
    
    refus()
    {
     echo Ne pas interrompre le programme...
    }
    
    ajout()
    {
     read -p"Nom : " nom
     read -p"Prenom : " prenom
     read -p"Numero de telephone : " tel
     read -p"Bureau : " buro
     read -p"Service : " serv
    
     echo "$nom:$prenom:$tel:$buro:$serv"
     echo "Confirmez-vous ? (o/n)"
     read reponse
     case "$reponse" in
      o|oui)
       echo "$nom:$prenom:$tel:$buro:$serv" >>$Annuaire
       echo Utilisateur $nom enregistré
      ;;
      n|non)
       echo "Information NON enregistrée"
      ;;
     esac
    
    }
    
    eclat()
    {
     for f in $(cut -d: -f5 $Annuaire | sort -u)
     do
      grep $f $Annuaire >>$f
     done
    }
    
    # Debut du programme 
    
    trap "refus" 2 3 15
    
    if [ $# -lt 1 ]
    then echo "Syntaxe : $(basename $0) [-opt] Nom_Annuaire" 1>&2; 
     exit 1
    fi
    
    eval Annuaire=\${$#}
    if [[ ! -e "$Annuaire" || ! -r "$Annuaire" ]]
    then echo "\"$Annuaire\" devrait être le nom d'un fichier annuaire lisible"
     exit
    fi
    
    if [ $# -eq 1 ]
    then
     sort "$Annuaire"
    else
     case $1 in
      -t) sort -t: -k 5 -k 1 "$Annuaire";;
      -T) sort -t: -k 3n "$Annuaire";;
      -M) cut -d: -f1 "$Annuaire";;
      -d) tail -1 "$Annuaire";;
      -m) tr ':' '.' <"$Annuaire" | cut -d. -f1,2;;
      -a) ajout;;
      -g)
       if [ $# -ne 3 ] 
       then echo "Syntaxe : $(basename $0) -g nom Nom_Annuaire" 1>&2; 
        exit 1
       else
        grep -i "^[^:]*$2[^:]*:" "$Annuaire"
       fi
      ;;
      -e) eclat;;
      -s)
       if [ $# -ne 3 ]
       then
        echo "Syntaxe : $(basename $0) -s Nom Nom_Annuaire" 1>&2; 
        exit 1
       else
        if grep "^$2" $Annuaire > /dev/null 2>&1
        then
         grep -v "^$2" $Annuaire >/tmp/ann.$$ 
         mv $Annuaire ${Annuaire}.old
         mv /tmp/ann.$$ $Annuaire
         echo $2 supprime
        else
         echo "L'utilisateur $2 n'est pas inscrit"
        fi
       fi
      ;;
      -b)
       if [ $# -ne 3 ]
       then
        echo "Syntaxe : $(basename $0) -b X Nom_Annuaire" 1>&2; 
        exit 1
       else
        grep "^[^:]*:[^:]*:[^:]*:$2.*:" $Annuaire | cut -d: -f1 | sort
       fi
      ;;
    
    
    *)   echo "Option ($1) inconnue"   exit  ;; esacfi


    À ce stade,
    ./annuaire.sh -a
    te fait passer dans cette partie du code :

    eval Annuaire=\${$#}
    if [[ ! -e "$Annuaire" || ! -r "$Annuaire" ]]
    then echo "\"$Annuaire\" devrait être le nom d'un fichier annuaire lisible"
     exit
    fi


    Tu peux rajouter un
    echo $Annuaire
    pour comprendre ce qui se passe (en l'occurrence il vaudra
    -a
    ) et du coup il est normal que le test soit vrai et déclenche le
    exit
    .

    Essaye de nous expliquer ce que le programme devrait faire...
    1
    1. ennouma_123 Messages postés 5 Statut Membre
       
      pour bien explique le programme c'est ne base de données des employées d'une entreprise dans la quelle on trouve 5 champs nom : prenom : tel : bureau : service
      cette base de données doit avoir des options par exemple:
      ajouter un nouvel inscrit (-a) , c'est à dire lors de l’exécution du programme avec l'option -a le terminal doit me donner la possibilité de remplir la base de données.
      et cela pour toute les options que j'ai défini dans le script

      afficher l'annuaire trié par service et par nom (-t)
      afficher l'annuaire trié sur le numéro de téléphone (-T)
      afficher la liste des noms des inscrits (-M)
      afficher le dernier inscrit (-d)
      afficher la liste des inscrits sous la forme Nom.Prénom (-m)
      rechercher un inscrit à partir de son nom (-g bac) ou d'une partie seulement (-g bou) et sans distinction des majuscules/minuscules
      ajouter un nouvel inscrit (-a)
      créer un fichier par service (-e)
      supprimer un inscrit (-s Bac)
      lister le personnel d'un bâtiment (-b X). Le bâtiment est indiqué par la première lettre du bureau.
      etc (selon votre imagination ou vos besoins).
      0
  3. ennouma_123 Messages postés 5 Statut Membre
     
    ui le fichier est exécutable mais lorsque je veux exécuter le scripte avec une option parmi les options que j'ai déjà programmer dans le script la même erreur m’apparaît
    0
  4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    On ne teste pas les arguments passés à un script avec un
    case … esac
    , mais avec une fonction intégrée au bash nommée
    getopts
    :
    man -P "less -p \"^ +getopts \"" bash


    0
    1. ennouma_123 Messages postés 5 Statut Membre
       
      merci, est ce que vous pouvez m'expliquer d'avantage
      0
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > ennouma_123 Messages postés 5 Statut Membre
         
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Est-ce que le langage est imposé ? Car faire ça en bash c'est quand même un peu la torture, il serait bien plus simple de faire ça par exemple en python...
    0