2013-09-16 44 views
5

Tôi biết cách tạo vòng lặp trong mỗi lần tăng, nhưng nói rằng tôi có dải từ 1 đến 773 và tôi muốn xuất một dải từ vòng lặp để tôi nhận được hai biến trong mỗi lần lặp. Đầu tiên sẽ là 1 và thứ hai sẽ nói 19. Trong phiên thứ hai đầu tiên sẽ là 20 và lần thứ hai 39.Gia tăng vòng lặp bash theo số lượng

Ive được chơi với một cái gì đó như:

for start in {1..773} 
do  
start=$(($start+20)) 
end=$(($start+20)) 
echo $start ## 
echo $end 
done 

mong muốn kết quả vòng lặp:

1. $start = 1 and $end = 19 
2. $start = 20 and $end = 39 
3. $start = 40 and $end = 59 
etc 

Nhưng điều đó không đúng. Tôi muốn xuất ra hai biến này thành một chuỗi các kịch bản để làm cho R chạy nhanh hơn, vì vậy nếu các giải pháp không bash (ví dụ awk) dễ dàng hơn thì điều đó cũng mát mẻ nếu một đơn giản> sẽ gửi tệp đó.

Cảm ơn!

+4

Vòng lặp là không phù hợp với khởi động. 1 trở thành 20 (+19), sau đó 20 trở thành 40 (+20). Điều đó là không thể trên một vòng lặp liên tục. – konsolebox

Trả lời

5

Nếu bạn muốn in các dãy trong vòng 773, bạn có thể làm như thế này

#!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 

Đầu ra

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 
+0

Tôi biết những gì tôi đã yêu cầu sẽ có một câu trả lời đơn giản, nhưng bạn làm việc tốt nhất. Nó bắt đầu từ 1 và bao gồm phạm vi hoàn chỉnh mà các câu trả lời khác thì không. Cảm ơn rất nhiều! – cianius

11

yêu cầu của bạn không hoàn toàn rõ ràng, nhưng bạn đang sử dụng lại tên biến.

nếu tôi làm điều này:

for index in {1..773} 
do  
    start=$(($index+20)) 
    end=$(($start+20)) 
    echo $start ## 
    echo $end 
done 

tôi nhận được một cái gì đó tương tự như kết quả mong muốn của bạn. quan sát cách tôi đổi tên biến vòng lặp từ đầu đến chỉ mục.

PS: nếu bạn muốn thay đổi kích thước bước (hay còn gọi là "tăng") trong vòng lặp của bạn, chỉ cần làm điều đó như thế này:

#!/bin/bash 
for i in {0..10..2} 
    do 
    echo "Welcome $i times" 
done 

này sẽ tăng ở bước 2, bạn sẽ muốn sử dụng 20 ở đây. Điều đó sẽ cung cấp cho bạn 1, 21, 41, ... làm giá trị. Xem http://www.cyberciti.biz/faq/bash-for-loop/ để biết thêm chi tiết.

+2

Hãy chắc chắn kiểm tra phiên bản 'bash' của bạn trước tiên. Hỗ trợ cho '{x..y..z}' đã được thêm vào 4.0 (có thể là 4.1; các thay đổi không đề cập đến nó và tôi không có một cá thể 4.0 để kiểm tra). – chepner

2

Dưới đây là một cách để làm điều đó:

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 

Đó là về cơ bản chỉ là một đơn giản cho vòng lặp.

5

Bạn có thể sử dụng seq lệnh

for start in `seq 1 20 700` 
do  
    echo $start $(($start+19)) 
done 

Việc sử dụng seq là:

$ 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. 
+1

Nên đề cập rằng số giữa là số gia tăng. –

+1

Cảm ơn @AbdullahAlMamun. Đã chỉnh sửa câu trả lời. – ztik

3

Đây là một cách để làm điều đó với kết quả đầu ra phù hợp:

for ((i = 1, start = 1, end = 19; i <= 773; ++i, start += 20, end += 20)); do 
    echo "$i. \$start = $start and \$end = $end" 
done 

Output:

1. $start = 1 and $end = 19 
2. $start = 21 and $end = 39 
3. $start = 41 and $end = 59 
4. $start = 61 and $end = 79 

Hoặc

for ((i = 1, start = 1, end = 19; i <= 773; ++i, start += 20, end += 20)); do 
    echo "$i. \$start = $start and \$end = $end" 
done 

Output:

1. $start = 1 and $end = 20 
2. $start = 21 and $end = 40 
3. $start = 41 and $end = 60 
4. $start = 61 and $end = 80 

Một:

for ((i = 1, start = 0, end = 19; i <= 773; ++i, start += 20, end += 20)); do 
    echo "$i. \$start = $start and \$end = $end" 
done 

Output:

1. $start = 0 and $end = 19 
2. $start = 20 and $end = 39 
3. $start = 40 and $end = 59 
4. $start = 60 and $end = 79 

Bằng cách đó bạn có thể có hai biến.

4

Trừ khi tôi là thiếu một cái gì đó bạn có thể chỉ cần làm:

for ((s=0,e=19; e<773; s+=20,e+=20)); do 
    echo $s "-" $e 
done 

OUTPUT:

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 
4

ai đã gợi ý một vòng lặp while

start=0 step=20 end=$((step - 1)) 
while ((end < 773)); do 
    echo "$start - $end" 
    ((start += step, end += step)) 
done 

Tạo

0 - 19 
20 - 39 
40 - 59 
... 
720 - 739 
740 - 759 

Tất nhiên, vòng lặp while có thể được viết như một vòng lặp for:

for ((start=0, step=20, end=step-1; end < 773; start+=step, end+=step)); do ... 
Các vấn đề liên quan