Script langstat.sh : demande de conseils et modifs

Messages postés
3
Date d'inscription
mardi 25 juin 2019
Statut
Membre
Dernière intervention
24 juillet 2019
-
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
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
36788
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
25 août 2019
3895
1
Merci
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}"
)

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 59148 internautes nous ont dit merci ce mois-ci

lEprofSonDkon
Messages postés
208
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
25 août 2019
11 -
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 !!!
Commenter la réponse de zipe31
Messages postés
3
Date d'inscription
mardi 25 juin 2019
Statut
Membre
Dernière intervention
24 juillet 2019
0
Merci
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
zipe31
Messages postés
36788
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
25 août 2019
3895 -
wc -l < test.txt
;-)
67jakol
Messages postés
3
Date d'inscription
mardi 25 juin 2019
Statut
Membre
Dernière intervention
24 juillet 2019
-
Merci pour le flux de redirection < qui permet d'afficher sur la console le nombre de lignes contenu dans le fichier. :o)
Commenter la réponse de 67jakol
Messages postés
1415
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 août 2019
69
0
Merci
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 :)
lEprofSonDkon
Messages postés
208
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
25 août 2019
11 -
bof, une fonction/factorisation pour une boucle qui est ± une factorisation...
bof.
Exileur
Messages postés
1415
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 août 2019
69 -
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 ...
lEprofSonDkon
Messages postés
208
Date d'inscription
jeudi 13 décembre 2018
Statut
Membre
Dernière intervention
25 août 2019
11 > Exileur
Messages postés
1415
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 août 2019
-
ta réponse n'a aucun rapport avec ma remarque.
Exileur
Messages postés
1415
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 août 2019
69 -
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.
Commenter la réponse de Exileur
Messages postés
1415
Date d'inscription
mercredi 31 août 2011
Statut
Membre
Dernière intervention
20 août 2019
69
0
Merci
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 ...

Commenter la réponse de Exileur