2013-09-16 5 views
5

Я знаю, как сделать цикл в bash, который увеличивается на единицу каждый раз, но говорят, что у меня есть диапазон от 1 до 773, и я хочу вывести диапазон из цикла, чтобы получить два переменных на каждой итерации. Первый будет 1, а второй будет сказать 19. Во второй итерации первой будет 20, а второй 39.Приращение в петле bash на заданное количество

Ive играл с чем-то вроде:

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) решения проще, тогда это тоже классно, если простой> отправит файл.

Спасибо!

+4

Петля не согласуется с включениями. 1 становится 20 (+19), затем 20 становится 40 (+20). Это невозможно в непрерывном цикле. – konsolebox

ответ

5

Если вы хотите печатать диапазоны в пределах 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 
+0

Я знал, что я просил бы получить простой ответ, но ваш работает лучше всего. Он начинается с 1 и включает полный диапазон, который нет в других ответах. Бесконечно благодарен! – cianius

11

Ваши требования не совсем понятны, но вы повторно используете имена переменных.

, если я это сделать:

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

я получить что-то, похожее на нужный вам результат. наблюдайте, как я переименовал переменную цикла от начала до индекса.

PS: если вы хотите изменить размер шага (так называемый «приращение») в цикле, просто сделать это следующим образом:

#!/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/ для более подробной информации.

+2

Обязательно сначала проверьте свою версию 'bash'. Поддержка «{x..y..z}» была добавлена ​​в 4.0 (возможно, 4.1, в журнал изменений не упоминается об этом, и у меня нет экземпляра 4.0 для проверки). – chepner

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 

Это в основном только простой цикл.

5

Вы можете использовать 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. 
+1

Следует упомянуть, что среднее число - это приращение. –

+1

Спасибо @AbdullahAlMamun. Отредактировал ответ. – ztik

3

Это один из способов сделать это с последовательными выходами:

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

Если я что-то вы можете не хватает просто сделать:

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

Конечно, цикл в то время как может быть записана как цикл:

for ((start=0, step=20, end=step-1; end < 773; start+=step, end+=step)); do ... 
Смежные вопросы