Forum Programmation.shell Copier n fois un paramètre dans une commande en bash (shell?)

Posté par  . Licence CC By‑SA.
Étiquettes :
3
7
fév.
2017

Bonjour,

Pour une raison inavouable j'avais besoin de dupliquer n fois un paramètre sur une ligne de commande :

commande foo foo foo foo foo foo ... (n fois)

La solution que j'ai trouvé c'est : par exemple pour n = 30

commande foo{,,}{,,,,,}{,,,} 
# (2*5*3)

Est-ce qu'il y a plus simple ? Plus joli ? En bash ? En shell ?

Bien à vous

AJOUT : Je faisais le malin avec ma solution, je me suis planté de 1 sur chacun des facteurs… c'est :

command foo{,}{,,}{,,,,}
  • # Perl (ou autre)

    Posté par  (site web personnel) . Évalué à 3.

     commande $(perl -e 'print "foo " x 32;')
    ```On peut faire pareil avec Python... L'opérateur important est ici 'x' (petit x et non multiplié).
    
    • [^] # Re: Perl (ou autres)

      Posté par  (site web personnel) . Évalué à 7. Dernière modification le 07 février 2017 à 13:22.

      Une boucle classique en shell :

      $ for i in $(seq 1 100) ; do printf "coin" ; done

      Une boucle classique en awk :

      $ awk 'BEGIN {for (i=0;i<100;++i) printf "coin"}'

      Une approche plus tordue :

      $ printf "%0.scoin" {1..100}

      Une autre version avec séparation par des espaces :

      yes "coin" | head -n 100| tr '\n' ' '

      nb: une simple recherche donne toutes ses solutions en première page des résultats

      • [^] # Re: Perl (ou autres)

        Posté par  (site web personnel, Mastodon) . Évalué à 6.

        Qu'il faut quand même passer en arguments à la commande initiale pour complètement répondre à la question:

        for i in $(seq 1 100) ; do printf "coin " ; done |xargs commande

        • [^] # Re: Perl (ou autres)

          Posté par  (site web personnel) . Évalué à 6.

          Sans pipe ni recourcs à xargs:

          commande $(for i in $(seq 1 100); do printf 'arg '; done)
          • [^] # Re: Perl (ou autres)

            Posté par  . Évalué à 3.

            Intéressant !

            Avec une substitution en moins et sans seq (dont on peut se passer facilement dans ce cas) :

            commande $(for i in {1..100} ; do printf 'arg '; done)

            • [^] # Re: Perl (ou autres)

              Posté par  (site web personnel) . Évalué à 4.

              Attention, c'est du Bash, ou du Zsh, mais plus du simple shell POSIX.

              • [^] # Re: Perl (ou autres)

                Posté par  . Évalué à 2.

                (en effet, passe pas sur le shell ash de mon routeur).
                La question portait bien sur du bash ({,,,}) et demandait explicitement « en bash ? » ;)

                Au passage, j'me posais la question :
                - seq n'est-il pas "non-standard", apporté par coreutils, donc non présent sur tous les systèmes ? (vraiment ?)
                - $() est compatible POSIX, mais seq ? Tout coreutils est-il POSIX ?
                Tout ça n’est pas complément clair pour moi, et ce que je trouve reste un peu flou. Si t'as un truc éclairant à pointer !

                Et en posix shell, sans seq, c'est possible ?

      • [^] # Re: Perl (ou autres)

        Posté par  . Évalué à 2.

        Oui, j'avais bien trouvé tout ça. Mais pour le coup, je préfère la mienne :-)

  • # On en apprend tous les jours !

    Posté par  (site web personnel) . Évalué à 2.

    Et dire que je croyais connaître le shell.

    C'est quoi qui fait répéter en utilisant les accolades ? Quelle est l'instruction ?
    Est-ce que quelqu'un peut m'orienter vers une doc qui décrit ceci ?
    C'est difficile à trouver avec un moteur de recherche (enfin, je n'ai pas trouvé la bonne recherche)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.