Is there a better way to run a command N times in bash?

后端 未结 19 2103
执笔经年
执笔经年 2020-11-28 00:26

I occasionally run a bash command line like this:

n=0; while [[ $n -lt 10 ]]; do some_command; n=$((n+1)); done

To run some_command

相关标签:
19条回答
  • 2020-11-28 01:07
    for _ in {1..10}; do command; done   
    

    Note the underscore instead of using a variable.

    0 讨论(0)
  • 2020-11-28 01:08

    Using a constant:

    for ((n=0;n<10;n++)); do some_command; done
    

    Using a variable (can include math expressions):

    x=10; for ((n=0; n < (x / 2); n++)); do some_command; done
    
    0 讨论(0)
  • 2020-11-28 01:09

    For loops are probably the right way to do it, but here is a fun alternative:

    echo -e {1..10}"\n" |xargs -n1 some_command

    If you need the iteration number as a parameter for your invocation, use:

    echo -e {1..10}"\n" |xargs -I@ echo now I am running iteration @

    Edit: It was rightly commented that the solution given above would work smoothly only with simple command runs (no pipes, etc.). you can always use a sh -c to do more complicated stuff, but not worth it.

    Another method I use typically is the following function:

    rep() { s=$1;shift;e=$1;shift; for x in `seq $s $e`; do c=${@//@/$x};sh -c "$c"; done;}

    now you can call it as:

    rep 3 10 echo iteration @

    The first two numbers give the range. The @ will get translated to the iteration number. Now you can use this with pipes too:

    rep 1 10 "ls R@/|wc -l"

    with give you the number of files in directories R1 .. R10.

    0 讨论(0)
  • 2020-11-28 01:10

    Using GNU Parallel you can do:

    parallel some_command ::: {1..1000}
    

    If you do not want the number as argument and only run a single job at a time:

    parallel -j1 -N0 some_command ::: {1..1000}
    

    Watch the intro video for a quick introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

    Walk through the tutorial (http://www.gnu.org/software/parallel/parallel_tutorial.html). You command line with love you for it.

    0 讨论(0)
  • 2020-11-28 01:11

    The script file

    bash-3.2$ cat test.sh 
    #!/bin/bash
    
    echo "The argument is  arg: $1"
    
    for ((n=0;n<$1;n++));
    do
      echo "Hi"
    done
    

    and the output below

    bash-3.2$  ./test.sh 3
    The argument is  arg: 3
    Hi
    Hi
    Hi
    bash-3.2$
    
    0 讨论(0)
  • 2020-11-28 01:15

    Another simple way to hack it:

    seq 20 | xargs -Iz echo "Hi there"
    

    run echo 20 times.


    Notice that seq 20 | xargs -Iz echo "Hi there z" would output:

    Hi there 1
    Hi there 2
    ...

    0 讨论(0)
提交回复
热议问题