Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/10/2012, à 19:30

shoot76

Projet BASH d'un programme pour mes révisions

Bonjour à tous,

je développe actuellement un programme me permettant de planifier mes révisions selon un méthode m'ayant été appris au début de mes études supérieures : la méthode des J. J'explique le principe : le cours a lieu à J0, et doit être révisé à J+1, J+2, J+3, J+7, J+14, J+1Mois etc ...
Bref, mon programme utilisant zenity prend forme, je demande à l'utilisateur les cours à travailler etc et les enregistre dans un fichier texte me permettant d'y avoir accès lors du prochain lancement. Seulement j'ai deux problèmes pour lesquels je ne trouve pas de réponse :

1) Comment puis récupérer les fichiers contenus dans une variable et les injecter dans une boucle for. Je m'explique.
J'enregistre la variable dans un fichier nommé "cours" de la sorte :

i=0
while [ $i -ne $nb ]
do
cours=$(zenity --entry --title="Méthode des J" --text="Indiquez ici le cours n°"$((i+1)))
i=$((i+1))
echo $cours >> cours
done

pour le récupérer je fais ça :

cours=$(cat cours)

mais le soucis est que si je réalise

echo ${cours[0]}

je récupère tous les cours. En somme : Ils ne sont pas enregistré comme un tableau de plusieurs suites de caractères, mais comme une seule suite ... Comment les séparer ? Mon but étant de pouvoir les utiliser ensuite dans une boucle while avec zenity.

2) J'ai bien réussi à récupérer avec la commande "date" uniquement le jour, mais comment programmer le fameux J+1, J+2 ... ? Le man et le help ne m'aident pas beaucoup :s

Merci pour l'aide que vous pourrez m'apporter, je vous présente le programme une fois terminé si cela interesse du monde

Cordialement


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#2 Le 29/10/2012, à 05:16

nesthib

Re : Projet BASH d'un programme pour mes révisions

1- c'est parce que tu n'utilises pas un tableau mais une chaîne de caractères :

unset i
cours=()
while [ $((i++)) -lt 4 ]
do
    cours+=( $(zenity --entry --title="Méthode des J" --text="Indiquez ici le cours n° $i") )
    # solution alternative :
    # cours=( ${cours[@]-} $(zenity --entry --title="Méthode des J" --text="Indiquez ici le cours n° $i") )
done

for i in "${cours[@]}"
do
  echo "→$i←"
done

2- date est très souple pour calculer :

date -d 'tomorrow'
date -d '+3 days'
date -d 'next week'

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#3 Le 29/10/2012, à 12:15

shoot76

Re : Projet BASH d'un programme pour mes révisions

Merci déjà pour ta réponse smile

La fonction date que tu me donnes fonctionne à merveille, en revanche, je n'arrive pas à utiliser ton script, même dans un fichier test que j'ai crée pour essayer d'en comprendre le fonctionnement :$
Est-ce moi qui ait un soucis ou il ne fonctionne pas ?

Et nouveau soucis : comment utiliser le "i" de la boucle for pour une variable ? genre à chaque tour de boucle, créer une variable nommée cours$i où je stock chaque cours pour les utiliser ensuite avec zenity ?
Dans le shell et quand je met ça dans mon script ça fait des erreurs de commande introuvable

jerome@laptop:~$ cours"$i"=$(zenity --entry)
cours2=coucou : commande introuvable
jerome@laptop:~$ cours$i=$(zenity --entry)
cours2=coucou : commande introuvable

Merci

Dernière modification par shoot76 (Le 29/10/2012, à 13:22)


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#4 Le 29/10/2012, à 16:18

nesthib

Re : Projet BASH d'un programme pour mes révisions

Il fonctionne, il lit 4 noms via zenity qu'il stocke dans un tableau et il les affiche par la suite. Si tu n'expliques pas ce qui ne va pas je ne peux rien faire de plus.

Il n'est pas possible d'utiliser simplement la variable i dans une autre variable pour l'affectation. Pourquoi ne pas rester sur ton tableau ? Il est quand même plus simple d'utiliser ${cours[x]}, non ?


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#5 Le 29/10/2012, à 16:50

shoot76

Re : Projet BASH d'un programme pour mes révisions

Edit : Je crois avoir réussi, grâce à ton aide !! Merci.
ça me donne un truc dans le genre :

cours=()
for i in $(cat cours)
do
	cours+=( $i )
	echo $i
done
echo "Premier :" ${cours[0]}
echo "Deuxième :" ${cours[1]}
echo "Total :" ${cours[@]}

qui me retourne :

jerome@laptop:~$ ./test.sh
cours1
cours2
Premier : cours1
Deuxième : cours2
Total : cours1 cours2

Dis moi ce que tu en pense smile
Plus qu'à utiliser ça avec zenity maintenant, et faire ma petite tambouille avec 'date'. Merci encore, je reviendrai ici si j'ai divers autres soucis smile

Dernière modification par shoot76 (Le 29/10/2012, à 17:05)


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#6 Le 29/10/2012, à 17:38

pingouinux

Re : Projet BASH d'un programme pour mes révisions

Bonjour,
Pour créer le tableau, si les lignes du fichier cours ne contiennent pas d'espaces :

cours=( $(cat cours) )

Hors ligne

#7 Le 29/10/2012, à 17:52

shoot76

Re : Projet BASH d'un programme pour mes révisions

pingouinux a écrit :

Bonjour,
Pour créer le tableau, si les lignes du fichier cours ne contiennent pas d'espaces :

cours=( $(cat cours) )

En fait, avec le script donné plus haut, j'enregistre directement le tableau, le fichier devient ainsi :

cours1 cours2 cours3 ... coursn

alors qu'avec ma version du script, j'avais des ligne, ce qui compliquait l'utilisation, et l'obligation d'une fonction read :

cours1 
cours2
cours3

Maintenant, il me suffit, comme montré plus haut, d'une boucle for parcourant le fichier, et let it rocks !

En tout cas, merci pour ta participation, toute info est bonne à prendre, surtout quand on débute comme moi ce langage smile

Merci infiniment à vous deux, et à ceux qui voudront apporter leur contribution par la suite

Cordialement

Dernière modification par shoot76 (Le 29/10/2012, à 17:55)


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#8 Le 29/10/2012, à 21:07

nesthib

Re : Projet BASH d'un programme pour mes révisions

L'utilisation de cat est inutile.

VARIABLE=$(<fichier)

Après je ne comprends pas vraiment ce que tu veux faire. Pourrais tu réexpliquer en utilisant éventuellement du pseudocode, et détailler la structure de tes données ?
Je pense que tu cherches peut être à faire compliqué pour rien.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#9 Le 30/10/2012, à 01:54

shoot76

Re : Projet BASH d'un programme pour mes révisions

Je vais t'expliquer avec du pseudo code, en effet ça sera peut être plus simple ^^

interface d'accueil avec zenity 4 choix : Définir les cours, 2) Consulter les cours du jour, 3) Ajouter les cours du jour, 4) Réinitialiser
si $? = Définir les cours
alors 
 je crée mon tableau définissant les cours comme vu avec toi avant et je l'enregistre dans un fichier texte
si $? = Consulter les cours du jour
alors
je récupère les données contenues dans un fichier étant repérable de la sorte : nomdufichier_datedaujourdhui, et je les affiche. Ce fichier est généré en 3, et comprend tous les J de la journée d'aujourd'hui
si $? = Ajouter les cours du jour
alors je reprend les cours définis en 1 dans le fichier cours, je les injecte dans zenity et fait une fenetre comprenant des choix multiples (cases à cocher) permettant l'ajout des cours sélectionnés à un fichier cours_$date où $date est la date respective des J0, J1, J2, J3, J7 ... 
si $? = réinitialiser
alors je fais un gros rm vulgaire des fichiers et dossiers créés pour l'utilisation de ce logiciel, et c'est reparti pour un tour

A l'heure actuelle, il ressemble à ça, sachant que j'ai pas encore fait d'améliorations ni quoi que ce soit, je cherche juste à ce qu'il fonctionne. La partie 1 est fonctionnelle, je réalise la partie 2 et 3 demain si tout se passe bien : Donc ne pas vraiment en tenir compte, ce qu'il y a dedans sera utilisé, mais ne sert pas pour le moment

#! /bin/bash


#Menu Principal
selection1=$(zenity --list --radiolist --title="Méthode des J" --column="" --column="Description" FALSE "Définir les cours à travailler" FALSE "Consulter les cours du jour" FALSE "Ajouter les cours du jour" FALSE "Réinitialiser")

#Conditions relatives
#1 Définir les cours à travailler
if [ "$selection1" = "Définir les cours à travailler" ]
then
	if [ -f cours ]
	then
		zenity --warning --text="Un fichier contenant les cours à travailler existe déjà ! \n Utilisez la fonction Réinitialiser pour pouvoir les modifier"
		exec $0
	else
		nb=$(zenity --entry --title="Méthode des J" --text="Veuillez indiquer ici \n le nombre de cours que vous souhaitez travailler :")
    		verifnb=$(zenity --question --text="Nombre de cours attendus, confirmez-vous ? : \n "$nb)
   	 	while [ $? -ne "0" ]
   		do
			nb=$(zenity --entry --title="Méthode des J" --text="Veuillez indiquer ici le nombre de cours que vous souhaitez travailler :")
			verifnb=$(zenity --question --text="Nombre de cours attendus, confirmez-vous ? : \n "$nb)
    		done
		cours=()
		while [ $((i++)) -lt $nb ]
		do
    			cours+=( $(zenity --entry --title="Méthode des J" --text="Indiquez ici le cours n°"$i) )
		done
		echo ${cours[@]} >> cours
		exec $0
	fi
fi

#2 Consulter les cours du jour
if [ "$selection1" = "Consulter les cours du jour" ]
then
	aujourdhui=$(zenity --title="Veuillez choisir la date d'intérêt" --calendar)
	while [ $? -ne "0" ]
	do
		aujourdhui=$(zenity --title="Veuillez choisir la date d'intérêt" --calendar)
		verifdate=$(zenity --question --text="Est-ce la bonne date ? \n "$aujourdhui)
	done
fi

#3 Ajouter les cours du jour
if [ "$selection1" = "Ajouter les cours du jour" ]
then
	aujourdhui=$(zenity --title="Veuillez choisir la date d'intérêt" --calendar)
	while [ $? -ne "0" ]
	do
		aujourdhui=$(zenity --title="Veuillez choisir la date d'intérêt" --calendar)
		verifdate=$(zenity --question --text="Est-ce la bonne date ? \n "$aujourdhui)
	done
fi

#4 Réinitialiser
if [ "$selection1" = "Réinitialiser" ]
then
	rm cours
	exec $0
fi

Si tu as des commentaires sur la syntaxe, des améliorations, des critiques... je suis preneur. Ce logiciel sera présenté à la rentrée pour mon avenir professionnel, étant débutant en bash, il est fortement probable qu'elle soit loin d'être parfaite :s

Merci encore pour ce temps que tu passes à m'aider smile

Dernière modification par shoot76 (Le 30/10/2012, à 01:58)


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#10 Le 30/10/2012, à 05:03

nesthib

Re : Projet BASH d'un programme pour mes révisions

Bon, je n'ai pas lu le code, mais juste ton pseudocode me dit que ta façon de faire est compliquée pour rien. En gros là tu stockes plusieurs fois la même version d'un fichier pour rien non ?
Voici comment j'organiserais les choses. Les cours sont enregistrés chacun dans un cours appelé « nom_du_cours.txt », et tu as un fichier « liste_de_cours » qui contient sur chaque ligne « nom_du_cours[un séparateur]date_J0_du_cours ».

Lorsque tu ajoutes un nouveau cours, tu peux faire un boîte de dialogue avec 2 champs : nom du cours et date (par défaut la date du jour) qui définit ton J0. Quand tu valides au crées une nouvelle ligne comme précédemment. Tu pourrais même ajouter un troisième champ, une zone de texte pour copier/coller le contenu du cours et créer le fichier « nom_du_cours.txt ». Si j'ai bien suivi ça ferait tes étapes 1 et 3. Tu peux même intégrer directement le contenu du cours si le fichier existe déjà, auquel cas tu aurais en même temps ta fonction 4. AMHA c'est bien plus ergonomique que d'avoir 4 boîtes de dialogue différentes. Ce qui ne t'empêche pas d'ajouter un menu vers les cours existants qui te permettrait de sélectionner directement un cours par son nom.

Pour la fonction 2 (accéder au cours à réviser) :
Tu lis le fichier « liste_de_cours » ligne à ligne (avec une boucle « while read line »).
Tu extrais pour chacune le nom du cours et la date du J0.
Tu détermines si la date d'aujourd'hui est un J+1, J+2, J+3, J+7, J+14, J+1Mois pour ce cours (je te recommande de faire une fonction pour ça).
Si oui, tu affiches le cours ou du moins le fait qu'il faille le réviser, sinon tu passes au suivant.


Pour résumer :

Boîte de dialogue d'intro → [1. ajouter (modifier) cours] [2. Voir cours existants] [3. Voir cours du jour]
Si 1 → boîte de dialogue d'ajout (préremplie avec les données si le cours existe déjà) : nom, jour J0, contenu
Si 2 → on affiche la liste de cours, et pour le cours sélectionné on va vers 1 (donc avec la situation « déjà prérempli »)
SI 3 → on calcule les cours à réviser et on propose de les afficher

edit : allez parce que je suis gentil (:p) voici la fonction pour calculer si aujourd'hui est un jour de révision à partir du J0.

function is_a_J_day {
# la fonction prend J0 au format AAAA-MM-JJ comme argument
d0=$1
# on calcule la date (depuis l'epoch) pour J0 et J
t_j0=$(date -d "${d0} 12:00" +'%s')
t_j=$(date -d 'today 12:00' +'%s')
t_diff=$(((${t_j}-${t_j0})/86400))
# on vérifie si c'est un jour de révision
case ${t_diff} in
  1|2|3|7|14|30) echo "J${t_diff}" ; return 0 ;;
  *) return 1;;
esac
}
$ is_a_J_day '2012-10-22' && echo OK || echo NOK
J7
OK
$ is_a_J_day '2012-10-21' && echo OK || echo NOK
NOK

Dernière modification par nesthib (Le 30/10/2012, à 05:10)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#11 Le 31/10/2012, à 12:45

shoot76

Re : Projet BASH d'un programme pour mes révisions

Voila mon programme qui fonctionne. J'ai eu quelques déboires avec la fonction date qui ne traite seulement les formats anglophones 10/31/2012, il a fallut que je joue dessus avec le zenity calendar, mais tout est passé finalement ! smile plus qu'à le rendre un peu plus esthétique, et simplifier éventuellement le code.
Je n'ai pas utilisé ta fonction car je n'en ai jamais utilisé, en cours ou personnellement :s je ne préferais pas y toucher mais je te remercie tout de même smile

si ça t'intéresse :

#! /bin/bash


#Création du dossier courant si non existant et déplacement

if [ $(pwd) != "/home/$USER/methj" ]
then
	if [ -d /home/$USER/methj ]
	then
		zenity --info --title="Méthode des J" --text="Bienvenue !" 
	else
		zenity --warning --title="Méthode des J" --text="Bienvenue ! Ceci doit être votre premier lancement, ou une Réinitialisation,\n je vais créer le dossier methj où seront stockées toutes les données relatives à son execution \n Bonne utilisation =D" 
		mkdir /home/$USER/methj
	fi
fi


#Menu Principal
selection1=$(zenity --list --radiolist --title="Méthode des J" --column="" --column="Description" FALSE "Définir les cours à travailler" FALSE "Consulter les cours du jour" FALSE "Ajouter les cours du jour" FALSE "Réinitialiser")


#Conditions relatives
#1 Définir les cours à travailler
if [ "$selection1" = "Définir les cours à travailler" ]
then
	if [ -f cours ]
	then
		zenity --warning --title="Méthode des J" --text="Un fichier contenant les cours à travailler existe déjà ! \n Utilisez la fonction Réinitialiser pour pouvoir les modifier"
		exec $0
	else
		nb=$(zenity --entry --title="Méthode des J" --text="Veuillez indiquer ici \n le nombre de cours total à travailler :")
    		verifnb=$(zenity --question --title="Méthode des J" --text="Nombre de cours attendus, confirmez-vous ? : \n "$nb)
   	 	while [ $? -ne "0" ]
   		do
			nb=$(zenity --entry --title="Méthode des J" --text="Veuillez indiquer ici le nombre de cours que vous souhaitez travailler :")
			verifnb=$(zenity --question --title="Méthode des J" --text="Nombre de cours attendus, confirmez-vous ? : \n "$nb)
    		done
		cours=()
		while [ $((i++)) -lt $nb ]
		do
    			cours+=( $(zenity --entry --title="Méthode des J" --text="Indiquez ici le cours n°"$i) )
		done
		echo ${cours[@]} > /home/$USER/methj/cours
		exec $0
	fi
fi

#2 Consulter les cours du jour
if [ "$selection1" = "Consulter les cours du jour" ]
then
	aujourdhui=$(zenity --title="Méthodes des J" --text="Veuillez sélectionner le jour d'intérêt" --calendar)
	while [ $? -ne "0" ]
	do
		aujourdhui=$(zenity --title="Méthodes des J" --text="Veuillez sélectionner le jour d'intérêt" --calendar)
		verifdate=$(zenity --question --title="Méthode des J" --text="Est-ce la bonne date ? \n "$aujourdhui)
	done
	cours=()
	for i in $(cat /home/$USER/methj/cours)
	do
		cours+=( $i:$(grep -R -m 1 $aujourdhui /home/$USER/methj/$i | cut -d: -f2) )
	done
	zenity --info --title="Méthode des J" --text="Vos cours à réviser aujourd'hui sont :\n" --text="${cours[*]}"
	exec $0
fi

#3 Ajouter les cours du jour
if [ "$selection1" = "Ajouter les cours du jour" ]
then
	aujourdhui=$(zenity --title="Méthodes des J" --calendar --date-format=%m/%d/%y --text="Veuillez indiquer le jour des cours à ajouter")
	while [ $? -ne "0" ]
	do
		aujourdhui=$(zenity --title="Méthodes des J" --calendar --date-format=%m/%d/%y --text="Veuillez indiquer le jour des cours à ajouter")
		verifdate=$(zenity --question --title="Méthode des J" --text="Est-ce la bonne date ? \n "$aujourdhui)
	done
	cours=()
	for i in $(cat /home/$USER/methj/cours)
	do
		cours+=(TRUE $i)
	done
	list=$(zenity --list --checklist --separator="\n" --title="Méthode des J" --text="Cochez les cours à garder" --column="" --column="Cours gardés" "${cours[@]}")
	echo $list > /home/$USER/methj/cours_gardes
	for i in $(cat /home/$USER/methj/cours_gardes)
	do
		echo $(date +%d/%m/%Y -d $aujourdhui):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
		echo $(date +%d/%m/%Y -d "$aujourdhui +tomorrow"):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
		echo $(date +%d/%m/%Y -d "$aujourdhui +2 days"):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
		echo $(date +%d/%m/%Y -d "$aujourdhui +3 days"):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
		echo $(date +%d/%m/%Y -d "$aujourdhui +7 days"):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
		echo $(date +%d/%m/%Y -d "$aujourdhui +2 weeks"):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
		echo $(date +%d/%m/%Y -d "$aujourdhui +1 month"):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
		echo $(date +%d/%m/%Y -d "$aujourdhui +2 months"):$(date +%d/%m/%Y -d $aujourdhui) >> /home/$USER/methj/$i
	done
	exec $0
fi

#4 Réinitialiser
if [ "$selection1" = "Réinitialiser" ]
then
	zenity --question --title="Méthode des J" --text="Attention ! Ceci supprimera toutes les données générées par le logiciel ! \n Êtes-vous sûr de vouloir tout supprimer ?"
	if [ $? -eq "0" ]
	then
		rm -r /home/$USER/methj/
		exec $0
	else
		zenity --info --title="Méthode des J" --text="Rien n'a été supprimé" 
		exec $0
	fi
fi

~ Data-sientist freelance : https://skulder.fr

Hors ligne

#12 Le 31/10/2012, à 17:28

nesthib

Re : Projet BASH d'un programme pour mes révisions

Tu n'est pas obligé de faire la fonction, tu peux faire une simple boucle à la place.

Si tu veux que je sois critique, il y a plein de petites choses qui ne vont pas :

  • $(pwd) → $PWD

  • tu devrais pouvoir travailler avec date en français, je te laisse chercher un peu (indice c'est un problème de LANG)

  • ne code pas tes chemins en dur comme « /home/$USER/methj », définis les dans une variable de configuration au début. SI l'utilisateur veut utiliser un autre chemin il n'aura pas à tout recoder. (attention dans ce cas à bien créer un sous dossier pour ne pas supprimer quelque chose d'important avec ta fonction « réinitialiser ».)

  • tu peux remplacer tes « if [ truc = machin] ; if ; if ; if » au pire par « if ; elif ; elif » puisque les cas sont exclusifs, au mieux par un « case truc in ; machin) … bidule) … »

  • la suite de mêmes commandes pour tous les jours est mal conçue, si tu avais 50 possibilités tu ferais 50 lignes ? Et 500 ?, utilise au minimum une boucle.

  • je t'ai déjà dit que $(cat …) est inutile (voir UUOC)

  • je n'ai pas testé ton code, mais tu n'as pas de mécanisme pour quitter ton programme ?

Fais comme tu le souhaites, mais je pense que tu y gagnerais à repenser la façon dont fonctionne ton programme.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#13 Le 31/10/2012, à 18:34

shoot76

Re : Projet BASH d'un programme pour mes révisions

Merci pour toutes ces critiques; y'en a déjà une bonne partie que j'avais trouvé seul et sur lesquelles je travaille actuellement. Je cherchais avant tout à avoir une syntaxe qui fonctionne sur laquelle me baser pour mon premier programme en BASH (je l'étudie depuis seulement quelques semaines en TP, donc des connaissances minimes), pour ensuite approfondir, et explorer des choses que je ne connais pas pour en améliorer la structure.
L'idée de la sélection du chemin d'enregistrement était dans ma tête, j'ai juste mis ça par défaut pour les tests et le fonctionnement de base du programme, j'implanterai ça à la fin.

L'idée du case me semble judicieuse, faut que je planche sur la structure et essayer de refaire le bidule tongue

Le reste : merci de me mettre tout ça en exergue, que je puisse travailler dessus, et le rendre, déjà plus lisible, et ensuite sûrement plus efficace pour l'oeil averti auquel je vais le présenter à la rentrée.

Je m'y colle et te tiens au courant


~ Data-sientist freelance : https://skulder.fr

Hors ligne

#14 Le 04/11/2012, à 15:00

shoot76

Re : Projet BASH d'un programme pour mes révisions

La version revue et corrigée :


#! /bin/bash



# Définition des fonctions

function verifdate {
aujourdhui=$(zenity --title="Méthodes des J" --text="Veuillez sélectionner le jour d'intérêt" --calendar --date-format=%Y-%m-%d)
while [ $? -ne "0" ]
do
    aujourdhui=$(zenity --title="Méthodes des J" --text="Veuillez sélectionner le jour d'intérêt" --calendar --date-format=%Y-%m-%d)
    verifdate=$(zenity --question --title="Méthode des J" --text="Est-ce la bonne date ? \n "$aujourdhui)
done
}

function verifcours {
	if [ ! -f $workd/cours.methj ]
	then
		zenity --info --text="Aucun cours n'a été défini au préalable,\nVeuillez utiliser Lister les cours"
		exec $0
	fi
}

function jour_j {
d0=$1
d1=$2
t_j0=$(date -d "${d0} 12:00" +'%s')
t_j=$(date -d "${d1} 12:00" +'%s')
t_diff=$(((${t_j}-${t_j0})/86400))
case ${t_diff} in
  1|2|3|7|14|30|60) 
  echo -e "$i \t $(date -d "$1" '+%d/%m/%Y')" >> $workd/tempo ; return 0 ;;
  *) return 1;;
esac
}

# Vérification / Création du dossier de travail

if [ -f /home/$USER/.methj_dir -a $(wc -l /home/$USER/.methj_dir | tr -s \   |cut -f1 -d\   ) -ne 0 ]
then
	workd=$(< /home/$USER/.methj_dir)
else
	zenity --info --height=100 --text="Bienvenue,\nTout d'abord nous devons sélectionner\nle répertoire de travail du logiciel"
	workd=$(zenity --file-selection --directory --text="Indiquez ici le chemin du répertoire \n qui sera utilisé par le logiciel")
	echo $workd >> /home/$USER/.methj_dir
	zenity --info --text="Parfait,\n\nBonne utilisation"
fi

# Début du programme 

selection1=$(zenity --list --width=670 --height=235 --radiolist --column="" --column="Action" --column="Description" FALSE "Lister les cours" "Liste TOUS les cours à travailler sans exception! C'est l'étape n°1" FALSE "Ajouter des cours" "Ajoute la date des cours ayant été suivis dans la journée aux fichiers correspondants" FALSE "Consulter les cours du jour" "Affiche les cours à travailler pour la journée choisie" FALSE "Réinitialiser" "Supprime tous les fichiers créés par le logiciel" --cancel-label="Quitter" --text="Bienvenue dans Méthode des J \nVeuillez sélectionner une action ci-dessous")

case "$selection1" in
	"Lister les cours")
		if [ -f $workd/cours ]
		then
			zenity --warning --text="Un fichier contenant les cours à travailler existe déjà.\nUtilisez la fonction Réinitialiser pour pouvoir les modifier"
			exec $0
		else
			nb=$(zenity --entry --text="Veuillez indiquer ici \n le nombre de cours total à travailler :")
    		verifnb=$(zenity --question --text="Nombre de cours attendus, confirmez-vous ? :\n"$nb)
   	 		while [ $? -ne "0" ]
   			do
				nb=$(zenity --entry --text="Veuillez indiquer ici le nombre de cours que vous souhaitez travailler :")
				verifnb=$(zenity --question --text="Nombre de cours attendus, confirmez-vous ? : \n "$nb)
    			done
			cours=()
			while [ $((i++)) -lt $nb ]
			do
    				cours+=( $(zenity --entry --text="Indiquez ici le cours n°"$i) )
			done
			echo ${cours[@]} > $workd/cours.methj
			exec $0
		fi
	;;
	"Consulter les cours du jour")
	    verifcours
	    verifdate
		echo -e "Cours \t Date du cours \n_______________________ \n" >> $workd/tempo
		for i in $(cat $workd/cours.methj)
		do
			while read ligne
			do
				jour_j $ligne $aujourdhui
			done < $workd/$i.methj
		done
		zenity --info --text="Vos cours à réviser aujourd'hui sont :\n" --text="$(awk -F"\t" '{ print $0 }' $workd/tempo)"
		rm $workd/tempo
		exec $0
	;;
	"Ajouter des cours")
	    verifcours
	    verifdate
		cours=()
		for i in $(cat $workd/cours.methj)
		do
			cours+=(TRUE $i)
		done
		list=$(zenity --list --checklist --separator="\n" --text="Cochez les cours à garder" --column="" --column="Cours gardés" "${cours[@]}")
		echo $list > $workd/cours_gardes.methj
		for i in $(cat $workd/cours_gardes.methj)
		do
			echo $(date +%Y-%m-%d) >> $workd/$i.methj
		done
		exec $0
	;;
	"Réinitialiser")
		zenity --question --text="Attention ! Ceci supprimera toutes les données générées par le logiciel ! \n Êtes-vous sûr de vouloir tout supprimer ?"
		if [ $? -eq "0" ]
		then
			rm $workd/*.methj && rm ~/.methj_dir
			exec $0
		else
			zenity --info --text="Rien n'a été supprimé" 
			exec $0
		fi
	;;
esac

Je reprend point par point tes remarques et commentaires :
[*]$(pwd) → $PWD ----> Inutile une fois la demande de chemin de fichier programmée avec zenity, je l'ai donc retiré[/*]
[*]tu devrais pouvoir travailler avec date en français, je te laisse chercher un peu (indice c'est un problème de LANG) ---> J'ai utilisé la fonction que tu m'as donné, le format de date n'était donc plus un soucis.[/*]
[*]ne code pas tes chemins en dur comme « /home/$USER/methj », définis les dans une variable de configuration au début. SI l'utilisateur veut utiliser un autre chemin il n'aura pas à tout recoder. (attention dans ce cas à bien créer un sous dossier pour ne pas supprimer quelque chose d'important avec ta fonction « réinitialiser ».) ----> Implémenté grâce à zenity, le choix du dossier se fait une seule fois, et enregistré dans un fichier caché dans le dossier personnel, de façon à ne pas devoir le choisir à chaque lancement.[/*]
[*]tu peux remplacer tes « if [ truc = machin] ; if ; if ; if » au pire par « if ; elif ; elif » puisque les cas sont exclusifs, au mieux par un « case truc in ; machin) … bidule) … ». ---> Un case a été utilisé, j'avoue que la structure s'en ressent, c'est plus propre. [/*]
[*]la suite de mêmes commandes pour tous les jours est mal conçue, si tu avais 50 possibilités tu ferais 50 lignes ? Et 500 ?, utilise au minimum une boucle. ---> La boucle n'ayant pas été déterminée, j'ai repris la fonction que tu as crée en l'arrangeant un petit peu pour coller à mes attentes.  [/*]
[*]je t'ai déjà dit que $(cat …) est inutile (voir UUOC) ---> utilisation de awk à la place pour l'affichage de "Consulter les cours", j'ai cependant toujours besoin de cat pour lire les cours du fichier du même nom. Sinon il ne me créé pas de tableau, donc impossible de l'utiliser sans l'associer à plein de commande style "tr" et "cut" ... j'ai donc laissé un seul $(cat ...) dans mon programme.[/*]
[*]je n'ai pas testé ton code, mais tu n'as pas de mécanisme pour quitter ton programme ? ---> J'ai modifié le nom du bouton "cancel" de l'interface principal, qui correspond au bouton quitter maintenant. [/*]
[*]Fais comme tu le souhaites, mais je pense que tu y gagnerais à repenser la façon dont fonctionne ton programme.---> C'est fait big_smile [/*]

Dernière modification par shoot76 (Le 04/11/2012, à 15:04)


~ Data-sientist freelance : https://skulder.fr

Hors ligne