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 :

Boucle for pour créer 10 fichiers txt contenant respectivement le message bonjour 1 fois à boujour 10 fois


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 34
    Points : 28
    Points
    28
    Par défaut Boucle for pour créer 10 fichiers txt contenant respectivement le message bonjour 1 fois à boujour 10 fois
    Bonjour à tous,

    je débute sous Linux.

    je veux créer 10 fichiers txt et que chacun contienne un message par exemple boujour 1 fois pour le fichier01.txt et bonjour 10 fois pour le fichier10.txt

    je souhaite utiliser une boucle for

    pour créer les fichiers j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touch exemple{01..10}.txt
    Mais pour le message je bloque... J'ai essayé ceci mais ça ne marche pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR /L %i IN (1,1,10) DO @ECHO Message %i
    Merci d'avance pour votre aide précieuse.
    F.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    Bonjour,

    si, si, ça marche
    sous MS-DOS.


    pour écrire du shell sur Linux, tu dois lire quelques tutoriels.
    regarde ma signature.

    PS: touch est inutile.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR /L %i IN (1,1,10) DO @ECHO Message %i
    Cette ligne de commande n'est pas du shell Linux mais Windows (voire MS-DOS).

    L'opérateur for de la commande bash est décrit ce paragraphe de la documentation
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Cette ligne de commande n'est pas du shell Linux mais Windows (voire MS-DOS).

    L'opérateur for de la commande bash est décrit ce paragraphe de la documentation

    J'ai parcouru le paragraphe je n'ai pas compris

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    L'équivalent de l'opérateur FOR que tu souhaitais utiliser est décrit là :
    for (( expr1 ; expr2 ; expr3 )) ; do liste ; done
    L'expression arithmétique expr1 est d'abord évaluée selon les règles décrites ci-dessous sous ÉVALUATION ARITHMÉTIQUE. L'expression arithmétique expr2 est ensuite évaluée répétitivement jusqu'à valoir zéro. Chaque fois que expr2 est évaluée en une valeur différente de zéro, liste est exécutée et l'expression arithmétique expr3 est évaluée. Si l'une des expressions est omise, elle est considérée comme s'évaluant à 1. La valeur renvoyée est l'état final de la dernière commande dans liste qui est exécutée ou faux si l'une des expressions est incorrecte.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    PS: touch est inutile.
    Oui et non, tout dépend du contexte d'utilisation

    Sinon, le vrai challenge serait de répondre à la question avec une boucle implicite , donc sans for,while...
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    je ne suis pas certain d'avoir compris.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    S_implicite() { FUNCNEST=10; n=${1:-0}; echo "bla bla $((++n))" >/tmp/fic_$n.txt; $FUNCNAME $n;}
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    J'aime bien, et ça montre des choses pas trop courante de bash
    Par contre la prochaine fois je préciserais aussi sans créer une fonction récursive

    Pour le touch, on a toujours tendance à dire que ce n'est pas utile, et c'est vrai bien souvent, mais faudrait dire pourquoi et forcer un peu le trait comme pour ls:
    -touch ne doit être utilisé que pour ce qu'il a été fait: changer les timestamps d'un fichier.
    -Si on veut avoir un NOUVEAU fichier, la simple redirection sur le fichier (>fichier) est suffisant.
    -Si on veut créer un fichier si celui-ci n'existe pas, on utilise la double redirection sur le fichier, (>>fichier) et ici, si le fichier existe déjà, alors il n'est pas touché même les timestamps ne change pas en force.
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ eval $(printf 'echo "bla bla %d" >/tmp/fic_%d.txt;' $(printf '%d\n' {1..10} {1..10} | sort -n))
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Inspiré d'un post de disedorgue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { printf "%s" "$2" >/tmp/fic_$1.txt; }; f' < <(printf 'bla bla %d\n' {1..10})
    Mais pour répondre à la demande de Fatouchka en #1 d'écrire le texte une fois dans le premier fichier, …, N fois dans le Nième fichier, je ne vois pas comment éviter un eval :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { eval "printf \"bla bla%.s\n\" {0..$1}" >/tmp/fic_$1.txt; }; f' < <(printf '%.s\n' {1..10})

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut

    petits bémols :
    les fichiers sont numérotés de 0 à 9
    et la deuxième version écrit autant de "bla bla" (sans* indiquer le nombre) que la valeur indiquée ( fic_1 : un "bla bla", fic_3 : trois "bla bla", fic_0 : 2 "bla bla" :: )
    --
    * edit
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Ah non, pour la deuxième version, j'ai bien cohérence entre la numérotation des fichiers et le nombre de bla bla, c'est-à-dire :
    fic_0.txt -> 1 bla bla
    fic_1.txt -> 2 bla bla

    fic_9.txt -> 10 bla bla

    Pour avoir la numérotation de 1 à 10 sans décalage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { n=$(($1+1)); eval "printf \"bla bla%.s\n\" {1..$n}" >/tmp/fic_$n.txt; }; f' < <(printf '%.s\n' {1..10})

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Citation Envoyé par balkany Voir le message
    Inspiré d'un post de disedorgue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { printf "%s" "$2" >/tmp/fic_$1.txt; }; f' < <(printf 'bla bla %d\n' {1..10})
    Mais pour répondre à la demande de Fatouchka en #1 d'écrire le texte une fois dans le premier fichier, …, N fois dans le Nième fichier, je ne vois pas comment éviter un eval :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { eval "printf \"bla bla%.s\n\" {0..$1}" >/tmp/fic_$1.txt; }; f' < <(printf '%.s\n' {1..10})
    Ça fait plaisir de voir que l'on ne donne pas des solutions pour rien.

    Et pour répondre à la solution sans eval:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { XX[$1]="bla bla"; n=$(($1+1)); printf "%s\n" "${XX[@]}" >/tmp/fic_$n.txt; }; f' < <(printf '%.s\n' {1..10})
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    il y a une ambiguïté dans le sujet :
    chacun contienne un message par exemple boujour 1 fois pour le fichier01.txt et bonjour 10 fois pour le fichier10.txt
    moi, je comprends que les fichiers doivent contenir bonjour N fois (le belge en moi )
    vous semblez avoir compris que les fichiers doivent contenir N fois bonjour. . .
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Et pour répondre à la solution sans eval:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { XX[$1]="bla bla"; n=$(($1+1)); printf "%s\n" "${XX[@]}" >/tmp/fic_$n.txt; }; f' < <(printf '%.s\n' {1..10})
    Eh oui, bien sûr, et XX a le bon goût de disparaitre en fin de traitement, toujours grâce au : |
    Citation Envoyé par N_BaH Voir le message
    moi, je comprends que les fichiers doivent contenir bonjour N fois (le belge en moi )
    Aaah ok, d'où l'incompréhension plus haut

  16. #16
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    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 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    il y a une ambiguïté dans le sujet :
    moi, je comprends que les fichiers doivent contenir bonjour N fois (le belge en moi )
    vous semblez avoir compris que les fichiers doivent contenir N fois bonjour. . .
    Dans le doute, on attendra un retour du P.O pour lui donner si besoin la solution avec for...
    Cordialement.

  17. #17
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Citation Envoyé par balkany Voir le message
    Eh oui, bien sûr, et XX a le bon goût de disparaitre en fin de traitement, toujours grâce au : |
    D'ailleurs, ça me fait penser : autre solution pour esquiver le eval sans introduire de variable supplémentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    : | mapfile -c1 -C 'f() { (($1)) && printf "%s" "${MAPFILE[@]}" >/tmp/fic_$1.txt; }; f' < <(printf 'bla bla%.s\n' {1..11})

  18. #18
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Dans le doute, on attendra un retour du P.O pour lui donner si besoin la solution avec for...
    Bonjour,

    Oui il faut qu'avec une boucle for :

    fichier1.txt contienne Bonjour 1 fois

    fichier2.txt contienne Bonjour 2 fois

    ...

    fichier10.txt contienne Bonjour 10 fois

    Merci beaucoup pour votre aide

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    yoohoo ! Belgique vaincra !!!


    c'est bête : avec ta commande MS-DOS, tu n'étais pas très loin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in {1..10}; do echo "Bonjour $i fois" >/tmp/fichier$i.txt; done
    Citation Envoyé par NBaH
    pour écrire du shell sur Linux, tu dois lire quelques tutoriels.
    regarde ma signature.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2020
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2020
    Messages : 34
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    yoohoo ! Belgique vaincra !!!


    c'est bête : avec ta commande MS-DOS, tu n'étais pas très loin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in {1..10}; do echo "Bonjour $i fois" >/tmp/fichier$i.txt; done
    Parfait !

    Mille mercis !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Python 3.X] boucle for pour créer objet dans class
    Par flapili dans le forum Général Python
    Réponses: 10
    Dernier message: 26/05/2017, 21h09
  2. [Batch] Deux boucles FOR pour comparer deux fichiers ligne par ligne et une condition IF
    Par Christophe.G dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 19/11/2014, 00h10
  3. [Batch] Boucle For pour parser des fichiers + exclusion
    Par L'assembleur dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 04/07/2011, 16h41
  4. Réponses: 1
    Dernier message: 18/02/2008, 20h21
  5. Réponses: 7
    Dernier message: 10/10/2007, 20h23

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