2015-04-22 202 views
0

我试图创建一个嵌套的for循环将从1数到10,第二或嵌套循环将从1我虽然数到5创建嵌套for循环bash脚本

for ((i=1;i<11;i++)); 
do 
    for ((a=1;a<6;a++)); 
    do 
     echo $i:$a 
    done 
done 

这个循环的输出将是是:

1:1 
2:2 
3:3 
4:4 
5:5 
6:1 
7:2 
8:3 
9:4 
10:5 

但不是输出为

1:1 
1:2 
1:3 
1:4 
1:5 
2:1 
... 
2:5 
3:1 
... 
and same thing till 10:5 

如何修改我的循环来获得我想要的结果! 谢谢

+0

请注意您的操作与'echo {1..5} {1..5}'类似。 – fedorqui

回答

3

你的逻辑错了。根本不需要嵌套循环。尝试:

for ((i=1;i<11;++i)); do 
    echo "$i:$((i-5*((i-1)/5)))" 
done 

这使用整数除法从$i的值中减去的5的倍数的权数:

  • $i是1和5之间,(i-1)/50,所以没有什么减去
  • $i是6和10之间,(i-1)/51,所以5被减去

1
a=0 
for ((i=1;i<11;i++)) 
do 
    a=$((a%5)) 
    ((a++)) 
    echo $i:$a 
done 

如果你真的需要它使用2个循环,try

for ((i=1;i<3;i++)) 
do 
    for ((a=1;a<6;a++)) 
    do 
     echo "$((i*a)):$a" 
    done 
done 
+0

我也是这么做的,这是错误的! –

+0

如果我想要使用嵌套循环,我将如何得到相同的结果! –

+0

...好吧,其实我没有这样做,我使用了正确的语法(它应该是'a = $((i%5))'。无论哪种方式,输出都是不正确的! –

1

在这种情况下,你不能使用嵌套循环。你所拥有的是第二个共同变量,即与外部循环变量类似的增量。它完全不依赖于外部循环变量。

这意味着你可以计算的ai值:

for ((i=1;i<11;i++)); do 
    ((a=((i-1)%5)+1)) 
    echo $i:$a 
done 

%5将确保该值始终为0和4这意味着我们需要i到从0到9之间给出我们i-1。之后,我们需要用+1将0 ... 4移动到0 ... 5。

1

我知道@AaronDigulla的答案是OP想要的。这是获得输出的另一种方式:)

paste -d':' <(seq 10) <(seq 5;seq 5)