Script langstat.sh : demande de conseils et modifs

67jakol Messages postés 3 Statut Membre -  
Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'ai fait un script pour une évaluation. Je souhaiterais savoir si vous pouviez y jeter un coup d'oeil et me dire ce qui pourrait être amélioré et comment?
Merci pour votre aide. Ca me permettrait de progresser...
jakol

#!/bin/bash

# On teste l'existence du premier paramètre (le fichier)
if [ ! $# -ge 1 ] || [ ! -e $1 ]
then
    echo 'Fichier de dictionnaire introuvable'
    exit 1
fi

# On fait un boucle sur les lettres. L'option -i de grep ignore la casse, et l'option -c donne le compte des lignes qui contiennent l'expression. Le tri s'effectue sur la sortie standard de la boucle.
for lettre in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
do

 printf "%s - %s\n" $(grep  -ic $lettre $1)  $lettre 

done | sort -rn 

# On test l'existence d'un deuxième paramètre test
if [ $# -ge 2 ] && [ $2 = 'test' ]
then
 shift
 
# on affiche le message dans la console 
    echo " j'ai testé un deuxième paramètre "

# on affiche le message dans le fichier test.txt
    echo " j'ai testé un deuxième paramètre" >> test.txt

    echo " Nombre de lignes dans test.txt : `wc -l test.txt` "

fi 

# On demande si l'on veut supprimer le fichier test.text
read -p "on supprime test.text ?  oui/non : " reponse
if [ $reponse =  'oui' ] 
then
 echo "on supprime le fichier test.txt"
 rm test.txt
 
else
 echo "on garde le fichier test.txt"
 
fi


Configuration: Windows / Chrome 75.0.3770.142

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    for lettre in A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    do

    for lettre in {A..Z} do…


    # on affiche le message dans la console
    echo " j'ai testé un deuxième paramètre "
    # on affiche le message dans le fichier test.txt
    echo " j'ai testé un deuxième paramètre" >> test.txt

    echo " j'ai testé un deuxième paramètre " | tee -a test.txt


    Mieux vaut prendre l'habitude d'entourer les variables d'accolades et de quotes doubles (
    echo "${mavar}"
    )

    1
    1. lEprofSonDkon Messages postés 227 Statut Membre 13
       
      ah, la guéguerre des accolades a repris !

      NON, les accolades ne sont pas indispensables si la variable n'est pas accolée à du texte :
      $ var=abc
      $ echo "$var"
      abc
      $ echo "$varAutrechose" #la variable `varAutrechose' n'existe pas
      $
      $ echo "${var}Autrechose" #ici, UNIQUEMENT ICI, les accolades ont du sens
      abcAutrechose


      sus aux accolades !!!
      0
  2. 67jakol Messages postés 3 Statut Membre
     
    Merci pour ta réponse. Je ne connaissais pas la commande tee

    Pour le code suivant comptant le nombre de lignes dans le fichiers test.txt

    echo " Nombre de lignes dans test.txt : `wc -l test.txt` "

    J'ai l'affichage suivant dans la console:

    Le nombre de ligne dans test.txt : 3 test.txt

    est-ce que c'est possible supprimer test.txt ? et Comment?

    Merci pour ton aide
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      wc -l < test.txt
      ;-)
      0
    2. 67jakol Messages postés 3 Statut Membre
       
      Merci pour le flux de redirection < qui permet d'afficher sur la console le nombre de lignes contenu dans le fichier. :o)
      0
  3. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
     
    Hello,

    En matiére d'amélio, je te proposerai :

    - je vérifie l'enssemble des mes paramétres d'entrée et je défini des variables nomées plutot qu'utiliser $1, $2 etc qui pourront vite devenir ilisible sur de gros scripts!

    if [ $# -ge 2 ]
    then
    var1="${1}"
    var2="${2}"
    elif [ $# -ge 1 ]
    var1="${1}"
    else
    echo 'Fichier de dictionnaire introuvable'
    exit 1
    fi


    - Pour ce qui est du prompt utilisateur, soit c'est oui, soit on fait rien? Aussi, on utilisera plutot le case dans le cas présent.
    while true; do
    read -p "on supprime test.text ? oui/non : " reponse
    case $reponse in
    [Oo]* ) echo "on supprime le fichier test.txt" && rm test.txt; break;;
    [Nn]* ) echo "on garde le fichier test.txt"; break;;
    • ) echo "Vous devez répondre [Oo]ui ou [Nn]on";; esacdone


    - Il n'y a aucune fonction dans ton code ? Imaginons que tu souhaites passer plusieurs fichiers à ton script ? Tu vas copier coller le code autant de fois que de paramétre possible ?
    function_name () {
    for lettre in {A..Z}
    do
    printf "%s - %s\n" $(grep -ic $lettre $1) $lettre
    done
    }
    function_name "${var1}" | sort -rn


    - Bon je chipotte mais générallement, je sépare le traitement de l'affichage.
    function_name () {
    declare -A ARRAY
    for lettre in {A..Z}
    do
    ARRAY[$lettre]=`grep -ic $lettre "${var1}"`
    done
    }
    function_name "${var1}"
    for key in "${!ARRAY[@]}"; do
    printf '%s = %s\n' "$key" "${ARRAY[$key]}"
    done


    A plus :)
    0
    1. lEprofSonDkon Messages postés 227 Statut Membre 13
       
      bof, une fonction/factorisation pour une boucle qui est ± une factorisation...
      bof.
      0
    2. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
       
      Oui, aprés s'il doit parser 15 fichiers, il peut toujours boucler sur le nombre d'argument -1 et vérifier si le dernier paramétre vaut 'test'. M'enfin ...
      0
      1. lEprofSonDkon Messages postés 227 Statut Membre 13 > Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention  
         
        ta réponse n'a aucun rapport avec ma remarque.
        0
    3. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
       
      Ok, amméliore le script en question pour pouvoir effectuer le méme travail de recherche de caractéres sur plusieurs fichiers, et fais moi ça sans dupliquer la 'factorisation' ou sans fonctions.

      Tu m'expliqueras ce qu'on factorise ici, au passage.
      0
  4. Exileur Messages postés 1621 Date d'inscription   Statut Membre Dernière intervention   150
     
    Hello,

    Je rajouterai que tu ne vérifies pas l'existance du fichier.

    En l'occurence, tu vérifies que le premier paramétre est défini. Que celui ci n'est pas vide. Mais tu ne sais pas si le fichier existe..

    Tu peux vérifier qu'un fichier avec :
    if [[ -f "$var1" ]]; then
        echo "$var1 exist"
    fi


    Et juste pour le fun :
    $ cat test2
    function usage() { echo "$1"; echo "langstat.sh <file> [test]"; exit 1; } 
    
    [[ -f "$1" ]] && var1="$1" || usage 'file not exist';
    
    echo "Traitement du fichier ..."
    
    $ bash test2 "aeazezea"
    file not exist
    langstat.sh <file> [test]
    
    $ bash test2 "/etc/hosts"
    Traitement du fichier ...
    

    0