我知道如何在bash中执行每次增加1的循环,但是我说我的范围是1到773,我想从循环中输出一个范围,这样我在每次迭代中得到两个变量。第一个将是1,第二个将是19.在第二个迭代中,第一个将是20,第二个是39.
我一直在玩类似的东西:
for start in {1..773}
do
start=$(($start+20))
end=$(($start+20))
echo $start ##
echo $end
done
期望的循环结果:
1. $start = 1 and $end = 19
2. $start = 20 and $end = 39
3. $start = 40 and $end = 59
etc
但这不对。我想将这两个变量输出到一系列脚本中以使R运行得更快,所以如果非bash(例如awk)解决方案更容易,那么如果简单的>那也很酷。会发送文件。
谢谢!
答案 0 :(得分:13)
您的要求并不十分清楚,但您正在重复使用变量名称。
如果我这样做:
for index in {1..773}
do
start=$(($index+20))
end=$(($start+20))
echo $start ##
echo $end
done
我得到的东西类似于你想要的结果。观察我如何将循环变量从开始重命名为索引。
PS:如果你想在循环中改变步长(a.k.a。“increment”),只需这样做:
#!/bin/bash
for i in {0..10..2}
do
echo "Welcome $i times"
done
这将以2为步长增加,你想在这里使用20。这会给你1, 21, 41, ...
作为价值。有关详细信息,请参阅http://www.cyberciti.biz/faq/bash-for-loop/。
答案 1 :(得分:10)
如果要在773范围内打印范围,可以这样做
#!env bash
start=1
end=19
for counter in {1..773}
do
echo $counter. "\$start = " $start " and \$end = " $end
if [[ $start -eq 1 ]];
then
start=0
fi
start=$(($start+20))
end=$(($end+20))
if [[ $end -ge 773 ]];
then
break
fi
done
<强>输出
1. $start = 1 and $end = 19
2. $start = 20 and $end = 39
3. $start = 40 and $end = 59
4. $start = 60 and $end = 79
5. $start = 80 and $end = 99
6. $start = 100 and $end = 119
7. $start = 120 and $end = 139
8. $start = 140 and $end = 159
9. $start = 160 and $end = 179
10. $start = 180 and $end = 199
11. $start = 200 and $end = 219
12. $start = 220 and $end = 239
13. $start = 240 and $end = 259
14. $start = 260 and $end = 279
15. $start = 280 and $end = 299
16. $start = 300 and $end = 319
17. $start = 320 and $end = 339
18. $start = 340 and $end = 359
19. $start = 360 and $end = 379
20. $start = 380 and $end = 399
21. $start = 400 and $end = 419
22. $start = 420 and $end = 439
23. $start = 440 and $end = 459
24. $start = 460 and $end = 479
25. $start = 480 and $end = 499
26. $start = 500 and $end = 519
27. $start = 520 and $end = 539
28. $start = 540 and $end = 559
29. $start = 560 and $end = 579
30. $start = 580 and $end = 599
31. $start = 600 and $end = 619
32. $start = 620 and $end = 639
33. $start = 640 and $end = 659
34. $start = 660 and $end = 679
35. $start = 680 and $end = 699
36. $start = 700 and $end = 719
37. $start = 720 and $end = 739
38. $start = 740 and $end = 759
答案 2 :(得分:8)
您可以使用seq
命令
for start in `seq 1 20 700`
do
echo $start $(($start+19))
done
seq
的用法是:
$ seq --help
Usage: seq [OPTION]... LAST
or: seq [OPTION]... FIRST LAST
or: seq [OPTION]... FIRST INCREMENT LAST
Print numbers from FIRST to LAST, in steps of INCREMENT.
答案 3 :(得分:4)
这是使用一致输出的一种方法:
for ((i = 1, start = 1, end = 19; i <= 773; ++i, start += 20, end += 20)); do
echo "$i. \$start = $start and \$end = $end"
done
输出:
1. $start = 1 and $end = 19
2. $start = 21 and $end = 39
3. $start = 41 and $end = 59
4. $start = 61 and $end = 79
或者
for ((i = 1, start = 1, end = 19; i <= 773; ++i, start += 20, end += 20)); do
echo "$i. \$start = $start and \$end = $end"
done
输出:
1. $start = 1 and $end = 20
2. $start = 21 and $end = 40
3. $start = 41 and $end = 60
4. $start = 61 and $end = 80
另:
for ((i = 1, start = 0, end = 19; i <= 773; ++i, start += 20, end += 20)); do
echo "$i. \$start = $start and \$end = $end"
done
输出:
1. $start = 0 and $end = 19
2. $start = 20 and $end = 39
3. $start = 40 and $end = 59
4. $start = 60 and $end = 79
这样你可以有两个变量。
答案 4 :(得分:4)
除非我遗漏了一些东西,否则你可以这样做:
for ((s=0,e=19; e<773; s+=20,e+=20)); do
echo $s "-" $e
done
<强>输出:
0 - 19
20 - 39
40 - 59
60 - 79
80 - 99
100 - 119
120 - 139
140 - 159
160 - 179
180 - 199
200 - 219
220 - 239
240 - 259
260 - 279
280 - 299
300 - 319
320 - 339
340 - 359
360 - 379
380 - 399
400 - 419
420 - 439
440 - 459
460 - 479
480 - 499
500 - 519
520 - 539
540 - 559
560 - 579
580 - 599
600 - 619
620 - 639
640 - 659
660 - 679
680 - 699
700 - 719
720 - 739
740 - 759
答案 5 :(得分:4)
没有人建议while
循环
start=0 step=20 end=$((step - 1))
while (( end < 773 )); do
echo "$start - $end"
(( start += step, end += step ))
done
可生产
0 - 19
20 - 39
40 - 59
...
720 - 739
740 - 759
当然,while循环可以写成for循环:
for ((start=0, step=20, end=step-1; end < 773; start+=step, end+=step)); do ...
答案 6 :(得分:2)
这是一种方法:
step=20
last=773
for ((i = 0; i <= $last; i += $step))
do
start=$i
end=$(($i + (($step - 1))))
if (($end > $last))
then
end=$last
fi
echo "\$start: $start"
echo "\$end: $end"
done
它基本上只是一个简单的for循环。