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. #21
    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
    @Jack-ft


    Ta solution fonctionne aussi tres bien j'ai juste un problème de retour à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find $dir/$environnement -type f | 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

  2. #22
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Dites moi ce que je peux encore corriger. De mon côté le résultat semble correct
    "semble" c'est bien le mot.
    1. tu remplis "dev", et "devcnt", et "int" avec "$1", puis ensuite tu évalues "$1" pour re-remplir "dev", ou "devcnt", ou "int".
    2. ensuite tu ne te sers absolument pas de ces variables
    3. for env in $1; do ... done N_BaH t'a déjà parlé de cette inutilité sans que tu en tires des leçons. Certains pourraient en déduire que ça ne sert à rien de prendre du temps pour t'expliquer les choses...
    4. je t'ai indiqué comment éviter de faire deux fois le find $dir/$environnement -type f 2>/dev/null pour l'envoyer en une seule fois vers deux commandes distinctes. Même remarque que ci-dessus...
    5. de toute façon tu envoies ce find $dir/$environnement -type f 2>/dev/null vers deux fonctions qui ne l'utilisent pas (comme là aussi déjà mentionné par N_BaH). Bon ben t'as qu'à continuer à ne pas lire ce qu'on écrit, bientôt nous on commencera à ne plus t'écrire ce que tu ne lis pas (certains semblent avoir d'ailleurs déjà commencés)


    Citation Envoyé par saga974 Voir le message
    Ta solution fonctionne aussi tres bien j'ai juste un problème de retour à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find $dir/$environnement -type f | 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
    Bah oui, deux '\n\n' ça fait deux retours de lignes à l'affichage, c'est évident pour tous sauf pour toi
    Et tu n'as pas besoin de fermer les quotes pour afficher une variable. echo "la variable vaut $var et c'est ok" marche tout ausi bien que echo "la variable vaut " $var " et c'est ok".
    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. #23
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 382
    Points
    19 382
    Par défaut
    plus de cent lignes, et probablement les 3/4 inutiles.
    tu fais du remplissage, mais c'est du vent.

    J'ai essayé de prendre en compte vos remarques.
    si c'était le cas, chaque ligne de commandes de ton script serait précédée d'un commentaire justifiant/expliquant sa présence.
    ces commentaires seraient autant de traces de la rédaction d'un algorithme préalable à l'écriture du code du script.
    l'algorithme peut être vu comme le squelette du script, et le code comme les muscles.
    un code, comme un robot, n'a pas besoin de peau/d'habillage.

    ce n'est pas parce que le shell est déconsidéré par certains programmeurs qu'il ne faut pas être rigoureux dans la rédaction d'un script shell
    un script est aussi un programme, et on ne peut pas programmer sans plan (sans algorithme !).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #24
    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
    Alors j'essaye de comprendre meme si vous pensez que je n'écoute pourtant j'écoute mais écouter et comprendre c'est pas la même chose.

    Je vais y aller par étape

    j'apporte une correction sur ce bloc est ce que c'est mieux ?

    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
    ######################################################
    #     Parametres du script
    ######################################################
     
    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
     
    for env in "$@"; do
    	echo "environnement sélectionné $@"
    	case "$env" in
    		dev)dev=$1;;
    		devcnt)devcnt=$2;;
    		int)int=$3;;
    	esac
    done

  5. #25
    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
    Quant au bloc suivant : avec le tee pour le moment je n'arrive pas au résultat escompté. Je fouine un peu encore pour trouver le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ######################################################
    #     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" 
     
    find $dir/$environnement -type f 2>/dev/null tee >(infos_compteurs >>"$log") >(infos_presence_fichiers >>"$log") >/dev/null

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 550
    Points : 19 382
    Points
    19 382
    Par défaut
    Je vais y aller par étape
    étape n°1 : brûler ton script.


    plus sérieusement :
    - le test sur le nombre d'arguments doit être placé au tout début du script : ça ne sert à rien de continuer si le compte n'est pas bon.
    d'ailleurs, combien d'arguments t'attends-tu à traiter ?

    - le case ne sert à rien : tu ne réemploies pas les variables qui y sont assignées.

    - quant à la boucle for... ça dépend du nombre d'arguments à traiter.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #27
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    j'apporte une correction sur ce bloc est ce que c'est mieux ?

    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
    ######################################################
    #     Parametres du script
    ######################################################
     
    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
     
    for env in "$@"; do
    	echo "environnement sélectionné $@"
    	case "$env" in
    		dev)dev=$1;;
    		devcnt)devcnt=$2;;
    		int)int=$3;;
    	esac
    done
    Je comprends pas ta logique. Il te faut essayer de comprendre ce que tu écris. A la limite, tu prends un papier et tu écris ce qui se passe.
    Tu lances ton script avec "int", "dev" et "toto" dans cet ordre.
    • première itération, la variable "env" vaut "int", tu remplis alors la variable "int" avec $3 qui vaut "toto"
    • seconde itération, la variable "env" vaut "dev", tu remplis alors la variable "dev" avec $1 qui vaut "int"
    • troisième itération, la variable "env" vaut "toto", tu ne remplis donc aucune variable

    Au final tu as int=toto et dev=int. Et tu ne fais en réalité rien de ces variables, rien d'autre que les remplir avec n'importe quoi.

    Citation Envoyé par saga974 Voir le message
    Quant au bloc suivant : avec le tee pour le moment je n'arrive pas au résultat escompté. Je fouine un peu encore pour trouver le problème
    Le problème a déjà été expliqué deux fois: les fonctions "infos_compteurs" et "infos_presence_fichiers" ne prennent pas de flux en entrée. Cela ne sert à rien de leur envoyer un flux via stdin car elles ne lisent pas stdin. C'est exactement comme si tu écrivais find /etc -print |ls -l.

    N_BaH a bien résumé: ton script tu le refais de zéro, en réfléchissant à "comment tu veux qu'il soit appelé" puis ensuite "comment traiter le(s) argument(s) qu'il reçoit".
    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]

  8. #28
    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
    Nbah, Svear

    Quand tu dis le case ne sert à rien je ne réemploi pas je ne comprends pas car pourtant j'appelle mon script de 3 manières différentes voire 4
    c'est a dire ./ingest_scriptlisterfiles2.sh dev cela fonctionne
    ./ingest_scriptlisterfiles2.sh devcnt cela fonctionne
    ./ingest_scriptlisterfiles2.sh int cela fonctionne
    ./ingest_scriptlisterfiles2.sh cela fonctionne et arrete bien le script car pas d'environnement sélectionné
    ./ingest_scriptlisterfiles2.sh toto ne devrait pas fonctionner car environnement toto n'existe pas. La ici je suis d'accord le script devrait pouvoir se mettre en erreur


    j'ai remodifié mais franchement j'avoue je comprends rien. Pourtant j'ai l'impression que le résultat attendu est là quand même et c'est ca qui me surprend comment un script fonctionne quand meme si on me dit qu'il est tout moisi. C'est un comble !!

    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
    #!/bin/bash
     
    date=$(date +%Y%m%d%H%M)
    dir='/sftpusers/user-*/data'
    environnement=$@
    log=/home/user-ingest/listerfichiers/log/fichierlog_"$environnement"_"$date".txt
    repRecherche=/sftpusers/
     
    ######################################################
    #     Parametres du script
    ######################################################
     
    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
     
    for environnement in $@; do
    	echo "environnement sélectionné $@"
    	case "$environnement" in
    		dev)dev=$1;;
    		devcnt)devcnt=$2;;
    		int)int=$3;;
    	esac
    done

  9. #29
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    bonjour
    Citation Envoyé par saga974 Voir le message
    j'ai remodifié mais franchement j'avoue je comprends rien. Pourtant j'ai l'impression que le résultat attendu est là quand même et c'est ca qui me surprend comment un script fonctionne quand meme si on me dit qu'il est tout moisi. C'est un comble !!
    Moi, je dirais que c'est un comble que tu ne comprends pas
    Je vais essayer sur un point

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dir='/sftpusers/user-*/data'
    environnement=$@
    ok, tu as tes 2 variables (car ici, tu ne passes qu'un unique paramètre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for environnement in $@; do
    	echo "environnement sélectionné $@"
    	case "$environnement" in
    		dev)dev=$1;;
    		devcnt)devcnt=$2;;
    		int)int=$3;;
    	esac
    done
    ici, un joli gloubiboulga :
    - Résonnement complètement faux (si tu ne le vois pas, c'est que tu as un niveau "pré" débutant)
    - ET tout cela pour créer 3 variables dec devcnt et int que tu ne vas JAMAIS utiliser par la suite
    Pourquoi écrire du code, créer des variables, leur donner des valeur fausses si on ne les utilise pas Oui, ton script va tourner (à peu près) mais c'est uniquement parce que c'est du code complètement inutile pour lui.

    Note: ok, il y a un traitement à faire si l'utilisateur peut passer plusieurs options au script (mais pas ce traitement actuel illogique)
    $moi= ( !== ) ? : ;

  10. #30
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Quand tu dis le case ne sert à rien je ne réemploi pas je ne comprends pas
    Réutilises-tu les variables "dev" ou "devcnt" ou "int" après les avoir remplies ? Car c'est un petit peu la raison d'être d'une variable: stocker une valeur qui servira ensuite.
    Accessoirement rien que le nom de tes variables montre déjà un problème de conception: le nom d'une variable ne doit pas être dépendant de son contenu mais représenter son contenu, ce qui n'est pas la même chose. Si je veux stocker l'info "j'ai des pommes", j'écrirai fruit="pomme" ou info="pomme" ou data="pomme" ; mais certainement pas pomme="pomme".

    Citation Envoyé par saga974 Voir le message
    car pourtant j'appelle mon script de 3 manières différentes voire 4
    c'est a dire ./ingest_scriptlisterfiles2.sh dev cela fonctionne
    ./ingest_scriptlisterfiles2.sh devcnt cela fonctionne
    ./ingest_scriptlisterfiles2.sh int cela fonctionne
    Cela m'étonnerait que cela fonctionne quand tu appelles ton script avec "devcnt" ou "int" car dans ce cas tu récupères $2 ou $3 alors qu'il n'y a qu'un seul argument (donc $2 et $3 n'existent pas).
    Par ailleurs, rien que le fait d'entamer une boucle de traitement de tous les arguments (le for env in "$@") alors que tu programmes un script prévu pour un seul argument aurait du aussi te faire réagir. On ne boucle pas sur "un" truc.

    Mais pour prouver le fonctionnement (ou plus précisément le "non fonctionnement") de ton code, suffit que tu testes ceci...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for env in "$@"; do
    	echo "environnement sélectionné $@"
    	case "$env" in
    		dev)dev=$1;;
    		devcnt)devcnt=$2;;
    		int)int=$3;;
    	esac
    done
     
    echo "dev=[$dev]"
    echo "devcnt=[$devcnt]"
    echo "int=[$int]"
    ... en l'appelant des 3 façons que tu cites et tu verras le résultat. Mais comme de toute façon, encore une fois ces variables ne sont pas réutilisées ensuite, leur contenu n'a aucune importance dans la suite du script.

    Citation Envoyé par saga974 Voir le message
    j'ai remodifié mais franchement j'avoue je comprends rien.
    C'est quelque part ce qu'on te reproche: vouloir faire du shell sans apprendre le shell.

    Citation Envoyé par saga974 Voir le message
    Pourtant j'ai l'impression que le résultat attendu est là quand même et c'est ca qui me surprend comment un script fonctionne quand meme si on me dit qu'il est tout moisi. C'est un comble !!
    Comme tu n'utilises pas tes variables remplies n'importe comment, elles n'ont pas d'effet sur le résultat. Comme tes fonctions "info_users" et "info_presence_fichiers" ne prennent pas en compte le find que tu leur envoies mais qu'elles refont leur propre find à l'identique, le find est quand-même fait (mais 3 fois au lieu d'une). Tu as donc un résultat je pense correct mais comme l'a dit N_BaH, avec 75% de lignes inutiles, faisant et refaisant n fois un même travail qui a été déjà fait en amont et qui sera refait en aval. C'est ce qu'on appelle "tomber en marche" (par opposition à "tomber en panne").

    Pour donner un comparatif: tu veux lister le premier argument de ton script, voici en gros ce que tu as écrit
    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
    liste() {
    	ls -l "$rep"
    }
     
    for arg in "$@"; do
    	test -d "$arg" || echo "[$arg] n'est pas un répertoire, recommencez"
    	case "$arg" in
    		tmp) dossier="/tmp";;
    		var) dossier="/var";;
    	esac
    done
     
    rep="$1"
    ls -l "$rep" |liste

    Voici ce que j'aurais écrit: ls -l "$1". Et bien que le tien fonctionne aussi, j'ai l'intuition que ce ne serait pas celui choisi par la majorité.

    Et si j'avais voulu lister tous les arguments, voici ce qu'on peut écrire
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste() {
    	cat			# Laisse ainsi le champ libre pour faire demain un traitement plus complexe si nécessaire...
    }
     
    for arg in "$@"; do
    	test -d "$arg" || echo "[$arg] n'est pas un répertoire, non traité"
    	ls -l "$arg" |liste
    done
    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]

  11. #31
    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
    Papajoker,

    Oui je suis plus que débutant. Ensuite je ne comprends pas
    dev devcnt et int ce sont bien mes paramètres que je mets en bout d'exécution de script comme évoqué avant. Ceci fonctionne bien après essai comme j'ai pu le dire. Tu dis que je passe un seul paramètre mais le "$@" reprends la liste des 3 paramètres non


    Svear,

    J'ai testé les echo la aussi ca fonctionne.
    Quand tu dis je ne les réutilises pas je ne comprends pas. Le résultat des logs m'affiche bien à chaque fois l'environnement qui est appelé dans les chemins de fichiers.
    J'ai donc des chemins de fichiers trouvés du genre /sftpusers/user-blabla/data/dev/20221202050031_PEGS.tar.gz ou /sftpusers/user-blabla/data/devcnt/20221202050031_PEGS.tar.gz ou /sftpusers/user-blabla/data/int/20221202050031_PEGS.tar.gz

    Donc le script utilise bien les variables


    Après je ne comprends pas pouquoi je ne peux pas nommé ceci comme tel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for environnement in $@; do
    	echo "environnement sélectionné $@"
    	case "$environnement" in
    		dev)dev=$1;;
    		devcnt)devcnt=$2;;
    		int)int=$3;;
     
    	esac
    done
    Devrais-je plutot renommer comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for environnement in $@; do
    	echo "environnement sélectionné $@"
    	case "$environnement" in
    		pierre)dev=$1;;
    		feuille)devcnt=$2;;
    		ciseaux)int=$3;;
     
    	esac
    done

  12. #32
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Donc le script utilise bien les variables


    Après je ne comprends pas pouquoi je ne peux pas nommé ceci comme tel
    Devrais-je plutot renommer comme ceci
    C'est grave, tu ne sais en fait pas ce que c'est une variable !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	case "$environnement" in
    		pierre)dev=$1;;
    		feuille)devcnt=$2;;
    		ciseaux)int=$3;;
     	esac
    ICI, tu vas créer les variables dev, devcnt et int !
    (la BASE: pour créer une variable, on écrit : variable=valeur)

    REGARDE VRAIMENT la suite de ton code ! JAMAIS tu n'utilises ces variables (il suffit d'ouvrir les yeux ou de faire un edition/rechercher dans ton éditeur)
    tu ne fais que des find $dir/$environnement -type f ... donc tu n'utilises QUE les 2 variables dir et environnement.
    ps: ce n'est que la 10 ème fois que l'on te le dit
    $moi= ( !== ) ? : ;

  13. #33
    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
    Et ici j'appelle bien la liste de toutes les variables avec le environnement=$@ ? et celle qui sera utilisée c'est bien celle qui sera appellée dans l'exécution du script ?
    si je tape ./ingest_scriptlisterfiles2.sh dev tout le script découle ensuite avec le dev
    si je tape ./ingest_scriptlisterfiles2.sh devcnt tout le script découle ensuite avec le devcnt
    si je tape ./ingest_scriptlisterfiles2.sh int tout le script découle ensuite avec le int

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    date=$(date +%Y%m%d%H%M)
    dir='/sftpusers/user-*/data'
    environnement=$@
    log=/home/user-ingest/listerfichiers/log/fichierlog_"$environnement"_"$date".txt

  14. #34
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par saga974 Voir le message
    Citation Envoyé par saga974 Voir le message
    ./ingest_scriptlisterfiles2.sh dev cela fonctionne
    ./ingest_scriptlisterfiles2.sh devcnt cela fonctionne
    ./ingest_scriptlisterfiles2.sh int cela fonctionne
    dev devcnt et int ce sont bien mes paramètres que je mets en bout d'exécution de script comme évoqué avant.
    Pas dans tes exemples. Dans ceux-ci (reproduits ci-dessus), tu n'appelles pas ton script avec trois paramètres mais avec un seul. Trois appels différents mais un seul paramètre à chaque appel. Ce qui n'est pas du tout pareil que "un seul appel avec 3 paramètres"...

    Citation Envoyé par saga974 Voir le message
    Ceci fonctionne bien après essai comme j'ai pu le dire. Tu dis que je passe un seul paramètre mais le "$@" reprends la liste des 3 paramètres non
    Non. Chaque appel étant indépendant, "$@" ne prend qu'un seul paramètre à chaque appel.

    Citation Envoyé par saga974 Voir le message
    Svear,
    J'ai testé les echo la aussi ca fonctionne.
    Ca dépasse l'entendement !!! Tu n'es même pas foutu de tester un script et de tirer les conséquences de ce que tu vois ??? Je vais t'inviter à dîner les mercredi soirs toi, tu es une graine de vainqueur...
    Ok, puisqu'il faut qu'on te mette les points sur les "i"...
    Nom : VirtualBox_Xubuntu64_02_12_2022_11_22_49.png
Affichages : 98
Taille : 182,3 Ko

    Citation Envoyé par saga974 Voir le message
    Quand tu dis je ne les réutilises pas je ne comprends pas. Le résultat des logs m'affiche bien à chaque fois l'environnement qui est appelé dans les chemins de fichiers.


    Citation Envoyé par saga974 Voir le message
    J'ai donc des chemins de fichiers trouvés du genre /sftpusers/user-blabla/data/dev/20221202050031_PEGS.tar.gz ou /sftpusers/user-blabla/data/devcnt/20221202050031_PEGS.tar.gz ou /sftpusers/user-blabla/data/int/20221202050031_PEGS.tar.gz

    Donc le script utilise bien les variables
    Utilises-tu les variables "$dev", ou "$devcnt", ou "$int" quelque part dans ton code? Ne serait-ce que dans un simple echo $dev ??? Dans ce cas, montre-moi où. Dis-moi "oui, telle ligne utilise $dev" (ou $devcnt ou $int)

    Citation Envoyé par saga974 Voir le message
    Après je ne comprends pas pouquoi je ne peux pas nommé ceci comme tel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for environnement in $@; do
    	echo "environnement sélectionné $@"
    	case "$environnement" in
    		dev)dev=$1;;
    		devcnt)devcnt=$2;;
    		int)int=$3;;
    	esac
    done
    Devrais-je plutot renommer comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for environnement in $@; do
    	echo "environnement sélectionné $@"
    	case "$environnement" in
    		pierre)dev=$1;;
    		feuille)devcnt=$2;;
    		ciseaux)int=$3;;
     
    	esac
    done

    Tu peux bien les nommer comme tu veux. Mais bon, pour une clarté de lecture et de modifications ultérieures, le nom qu'on donne à ses variables doit représenter le rôle qu'elles ont à jouer dans le code. Si je dois stocker le nom d'un fruit, ma variable se nommera "fruit", pas le nom du fruit. Si j'écris pomme="pomme", que se passera-t-il le jour où le fruit change et devient une orange ??? Vas-tu écrire pomme="orange" ? Tu en as le droit mais va le faire évoluer 6 mois plus tard (ou seulement le relire) et tu vas te crever les yeux juste pour ne plus avoir à lire ça.
    une variable ça varie...
    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. #35
    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
    La discussion est compliquée

    un conseil, lis https://abs.traduc.org/abs-fr/ même s'il commence à dater, ça t'aidera bien à comprendre les bases.
    Ou https://tldp.org/LDP/abs/html/abs-guide.html un peu plus récent mais en anglais.
    Sous Kubuntu 20.04

  16. #36
    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
    Svear je pense que la je peux me permettre d'insinuer que ce que je recherches n'est pas ce que tu crois que je recherche

    Je n'ai jamais dit que je voulais appelé 3 paramètres en même temps au script mais un à la fois indépendamment les uns des autres soit dev soit devcnt ou soit int et qu'ensuite en fonction de ce paramètre le script aille rechercher les fichiers pour le paramètre passé donc l'environnement voulu. D'où le fait que j'explique que chez cela fonctionne bien.

    Est ce que cette demande est plus compréhensible ou pas ?

  17. #37
    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
    Dans ce cas, l'utilisation de $@ est inutile, de même que les boucles for en lien ainsi que le case (un simple dossier="$1" suffit)...

    $@ sert si tu attends plusieurs arguments.
    $1 ne traite que le 1er quelque soir le nombre d'argument donné.
    Sous Kubuntu 20.04

  18. #38
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hizoka Voir le message
    La discussion est compliquée


    Citation Envoyé par saga974 Voir le message
    Svear je pense que la je peux me permettre d'insinuer que ce que je recherches n'est pas ce que tu crois que je recherche
    Tout à fait.

    Citation Envoyé par saga974 Voir le message
    Citation Envoyé par saga974 Voir le message
    En somme, je voudrais passer des paramètres au script ingest_scriptlisterfiles2.sh pour différents environnements.
    Je n'ai jamais dit que je voulais appelé 3 paramètres en même temps au script
    Ton premier post, au début de cette discussion (reproduit ci-dessus), mentionne explicitement "des" (pluriel) paramètres (là aussi au pluriel). Pour moi, "des" c'est "plus de un" (donc deux au minimum).
    Mais bon, admettons. Si tu penses à un script prévu pour un seul paramètre, alors pourquoi utilises-tu "$2" et "$3" (qui sont respectivement son second et troisième paramètre)??? Pourquoi boucler sur "$@" qui contient "tous les paramètres" ce qui sous-entend qu'il y en a plus d'un ? Et même pourquoi "boucler" (solution informatique de "répéter des actions") pour traiter "un seul" truc ???

    Citation Envoyé par saga974 Voir le message
    mais un à la fois indépendamment les uns des autres soit dev soit devcnt ou soit int et qu'ensuite en fonction de ce paramètre le script aille rechercher les fichiers pour le paramètre passé donc l'environnement voulu. D'où le fait que j'explique que chez cela fonctionne bien.
    Ah mais personne n'a dit que ça ne fonctionnait pas (on passera sur le "très bien"), on a juste dit que tu remplis des variables que tu n'utilises pas (donc pour rien), que tu exécutes des find que tu ne traites pas (donc travail inutile). Il se trouve qu'au milieu de tous ce "fatras" inutile certaines instructions sont, par chances, correctes et correctement exécutées. Donc le script produit effectivement un résultat cohérent. Ce qu'on te dit (sous différentes formulations), c'est que ce qui est inutile au mieux ne sert à rien, au pire peut gêner le fonctionnement. Tu as mon exemple à propos du ls -l "$1" bien plus simple et tout aussi efficace que

    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
    liste() {
    	ls -l "$rep"
    }
     
    for arg in "$@"; do
    	test -d "$arg" || echo "[$arg] n'est pas un répertoire, recommencez"
    	case "$arg" in
    		tmp) dossier="/tmp";;
    		var) dossier="/var";;
    	esac
    done
     
    rep="$1"
    ls -l "$rep" |liste
    Les deux scripts font le job (dans l'exemple lister les dossiers de l'argument). Mais je peux deviner lequel aura la préférence de la communauté des programmeurs shell.
    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]

  19. #39
    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
    Dans ce cas,

    Est ce que ceci est mieux si le case est inutile ? Je le supprime et teste la encore cela fonctionne bien et se rapproche des conseils donnés de l'inutilité du case

    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
    #!/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
     
    ######################################################
    #     Parametres du script
    ######################################################
     
    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
     
    for environnement in $1; do
    	echo "environnement sélectionné $1"
    done
    Merci hizoka pour les liens

  20. #40
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for environnement in $1; do
    	echo "environnement sélectionné $1"
    Merci de m'expliquer ce code, son utilité (j'ai l'impression que c'est un truc copié au hasard sur le web et avec aucun rapport avec ton script ?)
    $moi= ( !== ) ? : ;

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