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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    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 confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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 confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2018
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 129
    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.

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