Ta deuxième version de ton script est absolument gorissime. J'ai donc pris mon stylo pour t'écrire le canvas suivant:
(Il faut remplacer les [@ par un [[ mais dacode croit qu'il s'agit de liens wikipedia, d'où le subtil déguisement.)
sdata_statname='stats.html'# sdata_extract# Filter extracting tabular data out of statistiques html page## Input is the file served at https://freedom-ip.com/statistiques.php,# output is a list of load by servers, looking like## 390 NL# 315 NL2# 140 NL3# 140 NL4# 38 IE# 40 IE2# 10 IE3# 20 IE4
sdata_extract(){{
sed -n -e 's|^<img src=[./@:alnum:]]* alt="\([@:digit:]]*\) personnes connect.*es .* \([@:alnum:]]*\)".*|1円 2円|p'}}# sdata_sort_by_name# Filter sorting tabular data by name (ascending order)
sdata_sort_by_name(){
sort -d -k 2
}# sdata_sort_by_load# Filter sorting tabular data by load (ascending order)
sdata_sort_by_load(){
sort -g -k 1
}# sdata_try_to_connect# A filter connecting to a server.## It read tabular data and tries to connect in turn to each server. It# writes the record corresponding to the server it could connect to.## Notes:# - Use of echo(1) to output records is okay, because data is read(1).
sdata_try_to_connect(){local load
local server
sdata_connect_state='NOT_CONNECTED'while read load server; do if["$sdata_connect_state"='NOT_CONNECTED']; then if sdata_try_to_connect_loop "$load""$server"; thensdata_connect_state='CONNECTED'echo"$load""$server"fi fi done}
sdata_try_to_connect_loop(){if["2ドル"='NL2']; then return 0
else return 1
fi}# sdata_outcome# A filter describing the outcome of sdata_try_to_connect.
sdata_outcome(){read load server;
if["$load"=""]; thenprintf'Failure: could not connect to any server\n'elseprintf'Connected to server %s (%d users apart me), yeah!\n'\"$server""$load"fi}# sdata_connect()# The full connection chain.
sdata_connect(){
sdata_extract < "$sdata_statname"\
| sdata_sort_by_load \
| sdata_try_to_connect \
| sdata_outcome
}
sdata_connect
Ce n'est pas interdit de définir des fonctions au lieu de copier et coller à tort et à travers!
Ton bloc d'extraction des données de la page est visiblement un bon candidat pour faire une fonction. Au lieu d'enchaîner les cut on peut faire le travail proprement avec sed. C'est ma fonction sdata_extract qui mange ton fichier HTML et écrit un beau tableau bien propre avec toutes les statistiques. C'est l'étape N°1 de tout programme shell qui travaille sur des données: extraire les données dans un format propre. Après c'est un jeu d'enfant de les maniper avec sort, awk, etc.
Ensuite ton gros bloc de if imbiqués est classiquement représenté par une boucle, ce que fait le while , et c'est toujours achement plus facile de caler la boucle while dans une fonction dédiée (plus facile pour les pipes).
Ensuite, quelques conseils en vrac, que tu peux utiliser même si tu débutes en shell:
si tes diagnostics sont internationalisés il faut les piper à travers iconv avant de les afficher. Par exemple
printf 'Pouët\n' | iconv -f utf-8
si ton script est en utf-8, éventuellement rédiriger vers stderr.
Les trentes lignes de echo avec des lignes vides, des 'début de script' etc. ne servent à rien et créent une sortie inutilement difficile à analyser avec un programme: vire les.
Continue de poser tes questions ici, et si tu n'as pas lu ce journal vas-y!
[^] # Re: MAJ SCRIPT
Posté par Michaël (site web personnel) . En réponse au message Le plus petit. Évalué à 2. Dernière modification le 28 août 2012 à 21:15.
Ta deuxième version de ton script est absolument gorissime. J'ai donc pris mon stylo pour t'écrire le canvas suivant:
(Il faut remplacer les
[@par un[[mais dacode croit qu'il s'agit de liens wikipedia, d'où le subtil déguisement.)Ce n'est pas interdit de définir des fonctions au lieu de copier et coller à tort et à travers!
Ton bloc d'extraction des données de la page est visiblement un bon candidat pour faire une fonction. Au lieu d'enchaîner les
cuton peut faire le travail proprement avec sed. C'est ma fonctionsdata_extractqui mange ton fichier HTML et écrit un beau tableau bien propre avec toutes les statistiques. C'est l'étape N°1 de tout programme shell qui travaille sur des données: extraire les données dans un format propre. Après c'est un jeu d'enfant de les maniper avec sort, awk, etc.Ensuite ton gros bloc de if imbiqués est classiquement représenté par une boucle, ce que fait le
while, et c'est toujours achement plus facile de caler la boucle while dans une fonction dédiée (plus facile pour les pipes).Ensuite, quelques conseils en vrac, que tu peux utiliser même si tu débutes en shell:
si tes diagnostics sont internationalisés il faut les piper à travers iconv avant de les afficher. Par exemple
printf 'Pouët\n' | iconv -f utf-8
si ton script est en utf-8, éventuellement rédiriger vers stderr.
Les trentes lignes de echo avec des lignes vides, des 'début de script' etc. ne servent à rien et créent une sortie inutilement difficile à analyser avec un programme: vire les.
Continue de poser tes questions ici, et si tu n'as pas lu ce journal vas-y!