• [^] # Re: MAJ SCRIPT

    Posté par (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.)

    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"; then
    sdata_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" = "" ]; then
    printf 'Failure: could not connect to any server\n'
     else
    printf '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:

    1. 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.

    2. 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.

    3. Continue de poser tes questions ici, et si tu n'as pas lu ce journal vas-y!