Script langstat.sh : demande de conseils et modifs

67jakol Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
Exileur Messages postés 1475 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
A voir également:

4 réponses

zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
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
lEprofSonDkon Messages postés 211 Date d'inscription   Statut Membre Dernière intervention   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
67jakol Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
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
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 430
 
wc -l < test.txt
;-)
0
67jakol Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour le flux de redirection < qui permet d'afficher sur la console le nombre de lignes contenu dans le fichier. :o)
0
Exileur Messages postés 1475 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
lEprofSonDkon Messages postés 211 Date d'inscription   Statut Membre Dernière intervention   13
 
bof, une fonction/factorisation pour une boucle qui est ± une factorisation...
bof.
0
Exileur Messages postés 1475 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
lEprofSonDkon Messages postés 211 Date d'inscription   Statut Membre Dernière intervention   13 > Exileur Messages postés 1475 Date d'inscription   Statut Membre Dernière intervention  
 
ta réponse n'a aucun rapport avec ma remarque.
0
Exileur Messages postés 1475 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
Exileur Messages postés 1475 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