bash递增数组值脚本

时间:2012-11-26 18:26:24

标签: linux bash printing for-loop sh

我需要生成数字值并在curl上使用该值。我已经这样做但代码有一些错误,因为无法生成数字。

#!/bin/bash

for a in $(seq 0 9)
do
pass[0]="$a"
   for b in $(seq 0 9)
   do
   pass[1]="$b"
        for c in $(seq 0 9)
        do
        pass[2]="$c"
            for d in $(seq 0 9)
            do
            pass[3]="$d"
                for e in $(seq 0 9)
                do
                pass[4]="$e"
                    for f in $(seq 0 9)
                    do
                    pass[5]="$f"
                   curl -d "$a$b$c$d$e$f" somesite.php
                    done
                done
             done
         done    
     done
done

我得到了这个输出:

   echo ${pass[*}
>                     done
> 
Display all 289 possibilities? (y or n)
> e
>              done
>          done    
>      done
> done
> ^C

4 个答案:

答案 0 :(得分:3)

更简单(但仍然可怕):

for a in $(seq 0 9)
do
    for b in $(seq 0 9)
    do
        for c in $(seq 0 9)
        do
            for d in $(seq 0 9)
            do
                for e in $(seq 0 9)
                do
                    for f in $(seq 0 9)
                    do
                        curl -d "$a$b$c$d$e$f" somesite.php
                    done
                done
            done
        done    
    done
done

我不相信您复制到问题的脚本就是您执行的脚本。当我运行你的脚本时,它会执行如下命令:

curl -d 0 2 0 8 7 9 somesite.php

注意空格;我怀疑它们是(a)不需要的和(b)在没有IFS的情况下很大程度上是不可避免的,这比修正代码更糟糕。阵列很棒;他们不是为了一切。

顺便说一句,使用以下内容会更简单(

for number in $(seq -f '%06.0f' 0 1000000)
do
    curl -d "$number" somesite.php
done

或:

seq -f '%06.0f' 0 1000000 |
while read number
do
    curl -d "$number" somesite.php
done

或......还有其他方法可以做到(见其他答案)。 seq | while read循环的优点是不需要超过7 MiB的内存来存储数字。

curl一百万页需要一段时间。

答案 1 :(得分:1)

为什么不这样做?

#!/bin/bash
for ((i=0;i<1000000;++i)); do
    printf -v a "%.6d" "$i"
    curl -d "$a" somesite.php
done

编辑。由于你想拥有一个“更快”的方法,这是我能想到的最快的方法(其中最简单的是它们中最短的):

#!/bin/bash
for i in {000000..999999}; do
    curl -d "$i" somesite.php
done

答案 2 :(得分:1)

我认为这要好得多:

for (( i=0; i<1000000; i++ )); do 
    VAL=$(printf "%06d" $i)
    curl -d "$VAL" somesite.php
done

答案 3 :(得分:1)

试试这个

for i in `seq -f '%06.f' 0 999999`; do
    curl -d "$i" somesite.php
done