Script langstat.sh : demande de conseils et modifs

Fermé
67jakol Messages postés 3 Date d'inscription mardi 25 juin 2019 Statut Membre Dernière intervention 24 juillet 2019 - Modifié le 24 juil. 2019 à 10:45
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 - 29 juil. 2019 à 14:41
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
24 juil. 2019 à 14:13
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 jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
Modifié le 24 juil. 2019 à 20:54
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 mardi 25 juin 2019 Statut Membre Dernière intervention 24 juillet 2019
24 juil. 2019 à 15:11
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
24 juil. 2019 à 15:13
wc -l < test.txt
;-)
0
67jakol Messages postés 3 Date d'inscription mardi 25 juin 2019 Statut Membre Dernière intervention 24 juillet 2019
24 juil. 2019 à 15:25
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 mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
24 juil. 2019 à 16:57
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 jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13
24 juil. 2019 à 20:56
bof, une fonction/factorisation pour une boucle qui est ± une factorisation...
bof.
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
25 juil. 2019 à 08:05
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 jeudi 13 décembre 2018 Statut Membre Dernière intervention 8 octobre 2022 13 > Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022
25 juil. 2019 à 14:51
ta réponse n'a aucun rapport avec ma remarque.
0
Exileur Messages postés 1475 Date d'inscription mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
29 juil. 2019 à 14:41
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 mercredi 31 août 2011 Statut Membre Dernière intervention 16 décembre 2022 150
25 juil. 2019 à 08:30
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