IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Correction script shell paramètres


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 126
    Points : 23
    Points
    23
    Par défaut Correction script shell paramètres
    Bonjour la communauté,

    Je cherche à affiner le script suivant mais pour lequel je n'arrive pas à avoir le rendu final correct.

    En somme, je voudrais passer des paramètres au script ingest_scriptlisterfiles2.sh pour différents environnements.

    J'explique pour une meilleure compréhension en tapant par exemple : ./ingest_scriptlisterfiles2.sh dev ou devcnt ou int je veux que le script en s'exécutant sélectionne indépendamment l'un de l'autre soit l'environnement dev ou devcnt ou int située sous l'arborescence /sftpusers/user-*/data/dev ou /sftpusers/user-*/data/devcnt ou /sftpusers/user-*/data/int

    J'ai trouvé des petites choses sur la toile mais ceci ne fonctionne visiblement pas dans l'application puisque les fichiers ne sont pas filtrés en fonction de l'environnement dev devcnt ou int

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    #!/bin/bash
     
    date=$(date +%Y%m%d%H%M)
    log=/home/user-ingest/listerfichiers/log/fichierlog_$date.txt
    repRecherche=/sftpusers/
     
     
    #######################################################
    #       Titre avec Date en en-tête du fichier log
    #######################################################
     
    now="$(date +'%A %d %B %Y %H:%M')"
    titre="Fichier log du $now" 
     
     
    #######################################################
    #   Mise en Forme centrée de l'entete du fichier log
    #######################################################
     
    center() {
      termwidth="$(tput cols)"
      padding="$(printf '%0.1s' ={1..500})"
      printf "%*.*s %s %*.*s\n\n\n" 0 "$(((termwidth-2-${#1})/2))" "$padding" "$1" 0 "$(((termwidth-1-${#1})/2))" "$padding"
    }
    center "$titre" > "$log"
     
     
    #######################################################
    #          Existence de fichiers ou non
    #######################################################
     
    if [ -z "$(find "$repRecherche" -maxdepth 4 -type f 2>/dev/null)" ]; then
            echo -e "\e[1;31mPas de fichiers trouvés\e[0m \n\n "
    else
            echo -e "\e[1;31mDes fichiers existent\e[0m \n\n "
    fi
     
     
    #######################################################
    #          Informations sur les fichiers
    #######################################################
     
    infos_compteurs() {
     
    find "$repRecherche" -maxdepth 0 -type d | while read dossier; do
    	echo -e "\e[1;33mIl y a `find "$dossier" -type f 2>/dev/null | grep "data" | wc -l` fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data \e[0m \n\n"      ######tous les fichiers#########
     
    done
    }
     
     
    infos_presence_fichiers() {
     
    	today="$(date '+%s')"
    	while read fic; do
    		datedernieremodific="$(stat --format "%Y" "$fic")"
    		ecart=$((($today - $datedernieremodific) / 86400))
    		echo -e "nom du fichier : $fic"
    		echo -e "date dernier acces du fichier : $(stat --format "%.19x" "$fic")"
    		echo -e "durée de présence en jours : $ecart\n\n"
    		done
    }
     
     
    ######################################################
    #     Parametres du script
    ######################################################
     
    while getopts u:a:f: env
    do
        case "${env}" in
            u) dev=${OPTARG};;
            a) devcnt=${OPTARG};;
            f) int=${OPTARG};;
        esac
    done
    echo "environnement: $dev";
    echo "environnement: $devcnt";
    echo "environnement: $int";
     
    ######################################################
    #     Envoi des résultats trouvés vers le log
    ######################################################
     
     
    find "$repRecherche" -type f 2>/dev/null | grep "data" | infos_compteurs >> "$log"            ######tous les fichiers#########
    find "$repRecherche" -type f  2>/dev/null | grep "data" | infos_presence_fichiers >> "$log"     ######tous les fichiers#########
     
     
    more "$log"
     
    cp $log /home/user-ingest/listerfichiers/log/fichierlog_saagie.txt

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Bonjour la communauté,
    Salut

    Citation Envoyé par saga974 Voir le message
    J'explique pour une meilleure compréhension en tapant par exemple : ./ingest_scriptlisterfiles2.sh dev ou devcnt ou int je veux que le script en s'exécutant sélectionne indépendamment l'un de l'autre soit l'environnement dev ou devcnt ou int située sous l'arborescence /sftpusers/user-*/data/dev ou /sftpusers/user-*/data/devcnt ou /sftpusers/user-*/data/int
    Jusque là, ça reste du très classique...


    Citation Envoyé par saga974 Voir le message
    J'ai trouvé des petites choses sur la toile mais ceci ne fonctionne visiblement pas dans l'application puisque les fichiers ne sont pas filtrés en fonction de l'environnement dev devcnt ou int

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ######################################################
    #     Parametres du script
    ######################################################
     
    while getopts u:a:f: env
    do
        case "${env}" in
            u) dev=${OPTARG};;
            a) devcnt=${OPTARG};;
            f) int=${OPTARG};;
        esac
    done
    Faut pas utiliser getopts. getopts c'est fait pour récupérer les options d'un script, pas ses paramètres !!!
    Les options ce sont ces petites lettres précédées d'un tiret simple, ou ces mots précédés de deux tirets (options dites "longues" permettant de mieux se souvenir de leur rôle). Elles sont, comme l'indique leur nom, "optionnelles" et permettent d'influencer partiellement la commande.
    Exemple ls /tmp vs ls -a /tmp qui peut s'écrire aussi ls --all /tmp.

    Si tu veux créer un script dans lequel tu puisses mettre des options, alors tu utlises getopts (qui sert à les récupérer). Si tu veux simplement traiter ses paramètres (qui, eux, ne sont pas facultatifs), ils se trouvent dans la variable "$@".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ######################################################
    #     Parametres du script
    ######################################################
     
    for arg in "$@"; do
    	case "$arg" in
    		dev) traitement dev;;
    		devcnt) traitement devcnt;;
    		int) traitement int;;
    	esac
    done
    Accessoirement tu peux éviter cette répétition commande >action1; commande >action2 en utilisant la commande tee.
    find "$repRecherche" -type f 2>/dev/null | grep "data" | tee >(infos_compteurs >>"$log") >(infos_presence_fichiers >>"$log") >/dev/null
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 126
    Points : 23
    Points
    23
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    echo "dev: $1"
    echo "devcnt: $2"
    echo "int: $3"
     
    for env in $@; do
    	echo "environnement sélectionné $env"
    	done
    En appliquant ce code j'ai bien "en partie ce que je veux mais le hic cest si je tape ./ingest_scriptlisterfiles2.sh dev j'ai ceci correct

    dev: dev
    devcnt:
    int:
    environnement sélectionné dev


    En revanche si je tape ceci ./ingest_scriptlisterfiles2.sh devcnt j'ai ceci incorrect.

    dev: devcnt
    devcnt:
    int:
    environnement sélectionné devcnt


    Normalement, devcnt devrait se positionné sur la ligne decvnt comme ceci :

    dev:
    devcnt:devcnt
    int:
    environnement sélectionné devcnt



    Comment expliquer ce défaut ? et le corriger

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Comment expliquer ce défaut ? et le corriger
    Je ne t'ai pas parlé de "$1" et autres, alors pourquoi les utiliser???
    "$1" c'est le premier argument passé au script. Si tu écris echo "dev: $1" et que tu appelles le script avec "int" en premier paramètre, ça t'affichera "dev: int". Je ne vois pas ce que ça a d'anormal

    Citation Envoyé par saga974 Voir le message
    Normalement, devcnt devrait se positionné sur la ligne decvnt comme ceci
    devrait devrait...il n'y a rien de magique. Tout ce que ton script reçoit ce sont des chaines. C'est à toi de le programmer pour que ces chaines aient pour lui le sens qu'elles ont pour toi.

    Accessoirement tu remarqueras que dans mon exemple, j'ai écrit for env in "$@". Ce n'est pas anodin.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Non, sur tes 2 exemples, tu ne donne que 1 paramètre , donc tu n'as que $1
    Dans ton cas, le plus simple est de passer par un case (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    unset adev
    unset adevcnt
    unset aint
    case $1 in
      dev)
      adev=$1
      ;;
      devcnt)
      adevcnt=$1
      ;;
      int)
      aint=$1
      ;;
    esac
     
    echo "dev: ${adev}"
    echo "devcnt: ${adevcnt}"
    echo "int: ${aint}"
     
    for env in $@; do
    	echo "environnement sélectionné $env"
    	done
    Cordialement.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    tout cela me paraît inutilement compléxifié dans son expression.

    je récapitule :
    je veux travailler dans le sous-répertoire indiqué en paramètre de mon script.
    le paramètre, c'est dev OU devcnt OU int.

    par exemple, je veux lister les fichiers sous /sftp/user-*/data suivi du paramètre passé à mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
     
    dir=/sftp/user-*/data/
     
    ls $dir/$1
    et j'appelle mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ ./monScript dev #ou devcnt, ou int
    et c'est tout.

    après on peut tester que l'argument correspond aux paramètres attendus, etc.

    je suis passé à côté de quelque chose?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 126
    Points : 23
    Points
    23
    Par défaut
    Bonjour à tous !

    Alors j'ai essayé la méthode de svear

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for arg in "$@"; do
    	case "$arg" in
    		dev) traitement dev;;
    		devcnt) traitement devcnt;;
    		int) traitement int;;
    	esac
    Cela me remonte une erreur "erreur de syntaxe : fin de fichier prématurée" je ne comprends pas vraiment


    Quant à la solution de disedorgue je confirme cela fonctionne bien. J'ai quand meme rajouté un morceau de code pour dire qu'il n'y avait pas d'environnement sélectionné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    unset adev
    unset adevcnt
    unset aint
    case $1 in
      dev)
      adev=$1
      ;;
      devcnt)
      adevcnt=$1
      ;;
      int)
      aint=$1
      ;;
    esac
     
    echo "dev: ${adev}"
    echo "devcnt: ${adevcnt}"
    echo "int: ${aint}"
     
    for env in $@; do
    	echo "environnement sélectionné $env"
    	done
     
    if [ $@ -lt 1 ]; then
    	echo "Pas d'environnement sélectionné."
    	exit 0
     
    fi
    Pour ma culture je voudrais quand même essayer de comprendre pourquoi sur le code de svear cela ne fonctionne pas ?




    Nbah oui tu as compris. Dans un premier temps je veux passer des paramètres au script que j'appelle.
    Exemple : ./ingest_scriptlisterfiles2.sh dev ou ./ingest_scriptlisterfiles2.sh devcnt ou ./ingest_scriptlisterfiles2.sh int

    A priori comme je le dis avec la solution de disedorgue cela fonctionne très bien.


    Puis le but ensuite c'est que en fonction du paramètre passé à côté de l'appel du script cela me recherche les fichiers soit dans dev soit dans devcnt ou soit dans int et c'est donc sur ce point que maintenant je bute pour réussir à faire cela.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 126
    Points : 23
    Points
    23
    Par défaut
    Je reviens vers vous pour répondre en partie au deuxième point bloquant qui est de filtré en fonction de l'environnement ensuite sur les fichiers à trouver soit dans dev devcnt ou int

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    #!/bin/bash
     
    date=$(date +%Y%m%d%H%M)
    log=/home/user-ingest/listerfichiers/log/fichierlog_$date.txt
    repRecherche=/sftpusers/
     
     
    #######################################################
    #       Titre avec Date en en-tête du fichier log
    #######################################################
     
    now="$(date +'%A %d %B %Y %H:%M')"
    titre="Fichier log du $now" 
     
     
    #######################################################
    #   Mise en Forme centrée de l'entete du fichier log
    #######################################################
     
    center() {
      termwidth="$(tput cols)"
      padding="$(printf '%0.1s' ={1..500})"
      printf "%*.*s %s %*.*s\n\n\n" 0 "$(((termwidth-2-${#1})/2))" "$padding" "$1" 0 "$(((termwidth-1-${#1})/2))" "$padding"
    }
    center "$titre" > "$log"
     
     
    #######################################################
    #          Existence de fichiers ou non
    #######################################################
     
    if [ -z "$(find "$repRecherche" -maxdepth 4 -type f 2>/dev/null)" ]; then
            echo -e "\e[1;31mPas de fichiers trouvés\e[0m \n\n "
    else
            echo -e "\e[1;31mDes fichiers existent\e[0m \n\n "
    fi
     
     
    #######################################################
    #          Informations sur les fichiers
    #######################################################
     
    infos_compteurs() {
     
    find "$repRecherche" -maxdepth 0 -type d | while read dossier; do
    	echo -e "\e[1;33mIl y a `find "$dossier" -type f 2>/dev/null | grep "data"/$@ | wc -l` fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data \e[0m \n\n"      ######tous les fichiers#########
     
    done
    }
     
     
    infos_presence_fichiers() {
     
    	today="$(date '+%s')"
    	while read fic; do
    		datedernieremodific="$(stat --format "%Y" "$fic")"
    		ecart=$((($today - $datedernieremodific) / 86400))
    		echo -e "nom du fichier : $fic"
    		echo -e "date dernier acces du fichier : $(stat --format "%.19x" "$fic")"
    		echo -e "durée de présence en jours : $ecart\n\n"
    		done
    }
     
     
    ######################################################
    #     Parametres du script
    ######################################################
    unset adev
    unset adevcnt
    unset aint
    case $1 in
      dev)
      adev=$1
      ;;
      devcnt)
      adevcnt=$1
      ;;
      int)
      aint=$1
      ;;
    esac
     
    echo "dev: ${adev}"
    echo "devcnt: ${adevcnt}"
    echo "int: ${aint}"
     
    for env in $@; do
    	echo "environnement sélectionné $env"
    	done
     
    if [ $# -eq 0 ]; then
    	echo "Pas d'environnement sélectionné."
    	exit 0
    fi
     
     
     
     
    ######################################################
    #     Envoi des résultats trouvés vers le log
    ######################################################
     
     
    find "$repRecherche" -type f 2>/dev/null | grep "data"/$@ | infos_compteurs >> "$log"            ######tous les fichiers#########
    find "$repRecherche" -type f  2>/dev/null | grep "data"/$@ | infos_presence_fichiers >> "$log"     ######tous les fichiers#########
     
     
    more "$log"
     
    cp $log /home/user-ingest/listerfichiers/log/fichierlog_saagie.txt












    J'ai ajouté le $@ ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find "$repRecherche" -type f 2>/dev/null | grep "data"/$@ | infos_compteurs >> "$log"            ######tous les fichiers#########
    find "$repRecherche" -type f  2>/dev/null | grep "data"/$@ | infos_presence_fichiers >> "$log"     ######tous les fichiers#########

    cela filtre bien ok mais au niveau du bloc compteur de fichiers du coup c'est faussé et je ne vois pas comment établir un compteur pour les fichiers trouvés dans tel ou tel dossier soit dev int ou devcnt


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    infos_compteurs() {
     
    find "$repRecherche" -maxdepth 0 -type d | while read dossier; do
    	echo -e "\e[1;33mIl y a `find "$dossier" -type f 2>/dev/null | grep "data"/$@ | wc -l` fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data \e[0m \n\n"      ######tous les fichiers#########
     
    done
    }

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Alors j'ai essayé la méthode de svear

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for arg in "$@"; do
    	case "$arg" in
    		dev) traitement dev;;
    		devcnt) traitement devcnt;;
    		int) traitement int;;
    	esac
    Cela me remonte une erreur "erreur de syntaxe : fin de fichier prématurée" je ne comprends pas vraiment
    Tu as oublié le "done" qui termine le "do" (et qui est bel et bien présent dans mon exemple). De plus la symbolique "traitement" exprime le fait que ici tu dois programmer tes propres actions. Faudrait quand-même essayer de réveiller ton neurone !!!

    Citation Envoyé par saga974 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    ######################################################
    #     Parametres du script
    ######################################################
    unset adev
    unset adevcnt
    unset aint
    case $1 in
      dev)
      adev=$1
      ;;
      devcnt)
      adevcnt=$1
      ;;
      int)
      aint=$1
      ;;
    esac
     
    echo "dev: ${adev}"
    echo "devcnt: ${adevcnt}"
    echo "int: ${aint}"
     
    for env in $@; do
    	echo "environnement sélectionné $env"
    	done
     
    if [ $# -eq 0 ]; then
    	echo "Pas d'environnement sélectionné."
    	exit 0
    fi
    Sans déconner mais tu mélanges tout !!! A quoi sert de traiter $1 si tu traites tous les paramètres via $@? Et à quoi sert de traiter $@ si tu te contentes de bêtement afficher "environnement sélectionné" sans en tenir compte?
    $1 c'est pour traiter seulement le premier paramètre". $@ c'est pour traiter tous les paramètres (en partant du principe qu'un programme qui sait traiter une chose sera plus sympa à utiliser s'il sait traiter n fois n choses identiques, ce qui évitera de l'appeler n fois). Et il est plus intelligent de compter s'il y a des paramètres avant de les traiter (enfin ça me semble plus logique à moi)

    Citation Envoyé par saga974 Voir le message
    J'ai ajouté le $@ ici :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find "$repRecherche" -type f 2>/dev/null | grep "data"/$@ | infos_compteurs >> "$log"            ######tous les fichiers#########
    find "$repRecherche" -type f  2>/dev/null | grep "data"/$@ | infos_presence_fichiers >> "$log"     ######tous les fichiers#########
    Super, $@ c'est "tous les paramètres sous forme de grosse liste" On se demande pourquoi je tente de t'enseigner à les traiter un à un, effectivement c'est beaucoup plus facile de tous les prendre en bloc, le shell saura vachement mieux s'en sortir ainsi
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    je vais insister encore un peu pour montrer à quel point c'est simple, et que tu compliques tout inutilement* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dir='/sftpusers/user-*/data'
    environnement=$1
    find $dir/"$environnement" -type f
    ensuite, quand on traite la sortie de find, il est préférable de séparer les données par un caractère NULL (find ... -print0)

    --
    * c'est tellement vrai, que tu vas piper find à une fonction (info_compteur) qui ne lit pas ce qu'elle reçoit sur son entrée !
    qui plus est, le $@ d'une fonction est local.

    EDIT : un problème, c'est une multitude d'éléments simples; pour le résoudre, il faut les exposer simplement. KISS!
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 126
    Points : 23
    Points
    23
    Par défaut
    voila j'ai essayé d'appliquer vos astuces et conseils j'arrive à un résultat correct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    #!/bin/bash
     
    date=$(date +%Y%m%d%H%M)
    log=/home/user-ingest/listerfichiers/log/fichierlog_$date.txt
    repRecherche=/sftpusers/
     
     
    #######################################################
    #       Titre avec Date en en-tête du fichier log
    #######################################################
     
    now="$(date +'%A %d %B %Y %H:%M')"
    titre="Fichier log du $now" 
     
     
    #######################################################
    #   Mise en Forme centrée de l'entete du fichier log
    #######################################################
     
    center() {
      termwidth="$(tput cols)"
      padding="$(printf '%0.1s' ={1..500})"
      printf "%*.*s %s %*.*s\n\n\n" 0 "$(((termwidth-2-${#1})/2))" "$padding" "$1" 0 "$(((termwidth-1-${#1})/2))" "$padding"
    }
    center "$titre" > "$log"
     
     
    #######################################################
    #          Existence de fichiers ou non
    #######################################################
     
    if [ -z "$(find "$repRecherche" -maxdepth 4 -type f 2>/dev/null)" ]; then
            echo -e "\e[1;31mPas de fichiers trouvés\e[0m \n\n "
    else
            echo -e "\e[1;31mDes fichiers existent\e[0m \n\n "
    fi
     
     
     
    ######################################################
    #     Parametres du script
    ######################################################
    unset adev
    unset adevcnt
    unset aint
    case $1 in
      dev)
      adev=$1
      ;;
      devcnt)
      adevcnt=$1
      ;;
      int)
      aint=$1
      ;;
    esac
     
    echo "dev: ${adev}"
    echo "devcnt: ${adevcnt}"
    echo "int: ${aint}"
     
    for env in $1; do
    	echo "environnement sélectionné $env"
    	done
     
    if [ $# -eq 0 ]; then
    	echo "Pas d'environnement sélectionné."
    	exit 0
    fi
     
     
     
    #######################################################
    #          Informations sur les fichiers
    #######################################################
    dir='/sftpusers/user-*/data'
    environnement=$1
     
    infos_compteurs() {
     
    find "$repRecherche" -maxdepth 0 -type d | while read dossier; do
    	echo -e "\e[1;33mIl y a `find $dir/"$environnement" -type f 2>/dev/null | wc -l` fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data/"$environnement" \e[0m \n\n"      ######tous les fichiers#########
     
    done
    }
     
     
    infos_presence_fichiers() {
     
    	today="$(date '+%s')"
    	while read fic; do
    		datedernieremodific="$(stat --format "%Y" "$fic")"
    		ecart=$((($today - $datedernieremodific) / 86400))
    		echo -e "nom du fichier : $fic"
    		echo -e "date dernier acces du fichier : $(stat --format "%.19x" "$fic")"
    		echo -e "durée de présence en jours : $ecart\n\n"
    		done
    }
     
     
     
    ######################################################
    #     Envoi des résultats trouvés vers le log
    ######################################################
     
     
     
    find $dir/"$environnement" -type f 2>/dev/null | infos_compteurs >> "$log"
    find $dir/"$environnement" -type f 2>/dev/null | infos_presence_fichiers >> "$log" 
     
     
    more "$log"
     
    cp $log /home/user-ingest/listerfichiers/log/fichierlog_saagie.txt


    Désolé svear si je n'ai pas utilisé ta méthode elle m'affiche une nouvelle erreur. Hormis cela apres les tests les environnements sont sélectionnés indépendamment les uns des autres et le compteur affiche bien le nombre exact de fichiers pour chaque environnemnt.

    Je vais affiné l'envoi du resultat des logs par environnement maintenant

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Salut,

    voici quelques retours

    tu peux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [ -z "$(find "$repRecherche" -maxdepth 4 -type f 2>/dev/null)" ]; then
            echo -e "\e[1;31mPas de fichiers trouvés\e[0m \n\n "
    else
            echo -e "\e[1;31mDes fichiers existent\e[0m \n\n "
    fi
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if find "$repRecherche" -maxdepth 4 -type f -quit; then
            echo -e "\e[1;31mDes fichiers existent\e[0m \n\n "
    else
            echo -e "\e[1;31mPas de fichiers trouvés\e[0m \n\n "
    fi
    Qui s’arrête des qu'il aura trouvé un fichier, ça évite que le find les liste tous.

    une boucle for sur 1 argument n'a aucun interet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for env in $1; do
    	echo "environnement sélectionné $env"
    	done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "environnement sélectionné $1"
    Comme déjà signalé, place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if [ $# -eq 0 ]; then
    	echo "Pas d'environnement sélectionné."
    	exit 0
    fi
    en amont de ton case que le script ne fasse pas un travail inutile.

    `` est déprécié depuis longtemps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -e "\e[1;33mIl y a `find $dir/"$environnement" -type f 2>/dev/null | wc -l` fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data/"$environnement" \e[0m \n\n"      ######tous les fichiers#########
    *alors que souvent tu utilises bien $().
    Sous Kubuntu 20.04

  13. #13
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Citation Envoyé par hizoka
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if find "$repRecherche" -maxdepth 4 -type f -quit
    ça ne teste pas s'il y a des fichiers sous $repRecherche, mais seulement que la commande find s'est correctement terminée, ce qui n'est pas le cas uniquement si le répertoire n'existe pas ou si la commande est mal formée.

    @saga974 :
    • center() ne sert à rien, entre autres parce que tu centres une ligne dans un fichier qui ne sera peut-être pas lu dans un terminal, et pas un terminal au même dimension que le tien.
    • #Existence de fichiers : premier parcours du répertoire de recherche; il y en aura bien d'autres...
    • le case ne sert à rien puisque tu ne réutilises pas les variables qui y sont assignées
    • for env in $1 ne sert à rien, puisque le script n'accepte qu'un seul argument
    • comme hizoka : le test des arguments doit être fait dès le début du script
    • info_compteur sera erroné si un nom de fichier est sur plusieurs lignes (ce n'est jamais le cas jusqu'à ce que ça arrive)
    • dans info_compteur, tu boucles sur les répertoires de repRecherche, pour finalement chercher les fichiers sous $dir, c'est insensé.

    en grattant encore, je peux en trouver d'autres...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Désolé svear si je n'ai pas utilisé ta méthode
    Ce n'est pas "ma" méthode, c'est "la" méthode permettant de traiter tous les arguments passés au script. Exemple, quand tu tapes echo toto titi, tu es bien content que la commande "echo" affiche les deux éléments reçus, au lieu de devoir l'appeler deux fois. Ben pour tes scripts c'est pareil, s'ils doivent faire "un" truc, c'est plus sympa pour celui qui doit faire "n" trucs identiques, de ne pas avoir à appeler ton script "n" fois mais que toi tu aies fait l'effort d'offrir un script intelligent aux users. Donc traiter "n" arguments c'est traiter n fois "un" argument ; d'où boucle.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    ça ne teste pas s'il y a des fichiers sous $repRecherche, mais seulement que la commande find s'est correctement terminée, ce qui n'est pas le cas uniquement si le répertoire n'existe pas ou si la commande est mal formée.
    Ah ouais en effet, j'ai dit une connerie.
    Il faudrait plutôt partir sur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[ $(find  -maxdepth 4 -type f -print -quit) ]]
    Sous Kubuntu 20.04

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par saga974 Voir le message
    voila j'ai essayé d'appliquer vos astuces et conseils j'arrive à un résultat correct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    #######################################################
    #          Informations sur les fichiers
    #######################################################
    dir='/sftpusers/user-*/data'
    environnement=$1
     
    infos_compteurs() {
     
    find "$repRecherche" -maxdepth 0 -type d | while read dossier; do
    	echo -e "\e[1;33mIl y a `find $dir/"$environnement" -type f 2>/dev/null | wc -l` fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data/"$environnement" \e[0m \n\n"      ######tous les fichiers#########
     
    done
    }
    J'ai pas tout lu, mais je trouve pour le moins étrange une boucle sur une variable dossier qui n'apparaît pas dans la boucle...

    De plus, je crois qu'il vaut mieux utiliser les tput que les séquences d'escapes, le $() plutôt que les backticks et il vaut mieux mettre les variables entre guillemets (non testé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tput setaf 3; echo -e "Il y a $(find $dir/"$environnement" -type f 2>/dev/null | wc -l) fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data/$environnement\n\n" ; tput sgr0
    [EDIT]J'ai corrigé pour éviter de laisser une erreur: la variable $dir contient user-* et, comme l'a dit N_BaH, pour que le shell effectue le développement de chemins de l'astérisque, dans ce cas précis, la variable $dir ne doit PAS être entourée de guillemets.

  17. #17
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ici, il ne faut pas mettre $dir entre guillemets pour que le shell effectue le développement de chemins de l'astérisque.
    c'est l'un des "à moins de savoir pourquoi".
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Points : 1 876
    Points
    1 876
    Par défaut
    Une suggestion d'ordre général: installez shellcheck pour valider (et améliorer) vos scripts.
    En même temps c'est éducatif car ça explique pourquoi telle ou telle ligne de code est potentiellement buggée ou déficiente.

  19. #19
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ici, il y a un gros problème d'algorithmique; shellcheck n'y fera rien.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 126
    Points : 23
    Points
    23
    Par défaut
    Bonjour à tous,

    Merci pour vos retours.

    J'ai essayé de prendre en compte vos remarques. Certaines fonctionnent très bien. Sur d'autres j'ai des problèmes voici les corrections apportées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #!/bin/bash
     
    date=$(date +%Y%m%d%H%M)
    dir='/sftpusers/user-*/data'
    environnement=$1
    log=/home/user-ingest/listerfichiers/log/fichierlog_"$environnement"_"$date".txt
    repRecherche=/sftpusers/
     
    ######################################################
    #     Parametres du script
    ######################################################
     
    dev=$1
    devcnt=$1
    int=$1
     
    if [ $# -eq 0 ]; then
    	echo "Pas d'environnement sélectionné. Relancer les script avec dev devcnt ou int derrière la commande"
    	exit 0
    fi
     
     
    case $1 in
      dev)dev=$1;;
      devcnt)devcnt=$1;;
      int)int=$1;;
    esac
     
     
    for env in $1; do
    	echo "environnement sélectionné $1"
    	done
     
     
     
     
     
    #######################################################
    #       Titre avec Date en en-tête du fichier log
    #######################################################
     
    now="$(date +'%A %d %B %Y %H:%M')"
    titre="Fichier log du $now" 
     
     
    #######################################################
    #   Mise en Forme centrée de l'entete du fichier log
    #######################################################
     
    center() {
      termwidth="$(tput cols)"
      padding="$(printf '%0.1s' ={1..500})"
      printf "%*.*s %s %*.*s\n\n\n" 0 "$(((termwidth-2-${#1})/2))" "$padding" "$1" 0 "$(((termwidth-1-${#1})/2))" "$padding"
    }
    center "$titre" > "$log"
     
     
    #######################################################
    #          Existence de fichiers ou non
    #######################################################
     
    if [ -z "$(find $dir/$environnement -type f 2>/dev/null)" ]; then
            echo -e "\e[1;31mPas de fichiers trouvés\e[0m \n\n "
    else
            echo -e "\e[1;31mDes fichiers existent dans l'arborescence $dir \e[0m \n\n "
    fi
     
     
     
    #######################################################
    #          Informations sur les fichiers
    #######################################################
     
     
    infos_compteurs() {
     
    find $dir/$environnement -type f | echo -e "\e[1;33mIl y a "$(find $dir/$environnement -type f 2>/dev/null | wc -l)" fichiers trouvés dans l'arborescence sftpusers/user-XXXX/data/"$environnement" \e[0m \n\n"      
     
    }
     
     
    infos_presence_fichiers() {
     
    	today="$(date '+%s')"
    	while read fic; do
    		datedernieremodific="$(stat --format "%Y" "$fic")"
    		ecart=$((($today - $datedernieremodific) / 86400))
    		echo -e "nom du fichier : $fic"
    		echo -e "date dernier acces du fichier : $(stat --format "%.19x" "$fic")"
    		echo -e "durée de présence en jours : $ecart\n\n"
    		done
    }
     
     
     
    ######################################################
    #     Envoi des résultats trouvés vers le log
    ######################################################
     
     
     
    find $dir/$environnement -type f 2>/dev/null | infos_compteurs >> "$log"
    find $dir/$environnement -type f 2>/dev/null | infos_presence_fichiers >> "$log" 
     
     
    more $log
     
    cp $log /home/user-ingest/listerfichiers/log/fichierlog_$environnement_saagie.txt

    Dites moi ce que je peux encore corriger. De mon côté le résultat semble correct

    @Nbah : quelle proposition alternative existe t-il pour une mise en forme pour obtenir un titre de script en entête ?

Discussions similaires

  1. Script shell qui parcourt un fichier pour avoir la liste des paramètres
    Par 69Pierre dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 24/06/2019, 18h03
  2. Réponses: 4
    Dernier message: 13/05/2014, 14h49
  3. Création d'un script Shell avec 4 paramètres en entrée
    Par Lerchechem dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 17/09/2013, 11h32
  4. Passer des paramètres d'un script shell à une application Java
    Par Kihmé Xs dans le forum Général Java
    Réponses: 4
    Dernier message: 02/05/2012, 22h56
  5. afficher les paramètres d'un script shell avec une boucle for
    Par nakatami dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 15/03/2011, 19h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo