14

毎回1ずつ増加するbashでループを実行する方法を知っていますが、範囲が1から773であり、ループから範囲を出力して、各反復で2つの変数を取得したいとします。1 回目は 1 で、2 回目は 19 とします。2 回目の繰り返しでは、1 回目は 20、2 回目は 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

しかし、それは正しくありません。これら 2 つの変数を一連のスクリプトに出力して R をより高速に実行したいので、bash 以外 (awk など) のソリューションの方が簡単な場合は、単純な > でファイルを送信することもできます。

ありがとう!

4

7 に答える 7

19

あなたの要件は完全に明確ではありませんが、変数名を再利用しています。

私がこれを行う場合:

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/を参照してください。

于 2013-09-16T12:40:12.200 に答える
15

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.
于 2013-09-16T12:47:01.953 に答える
13

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
于 2013-09-16T12:50:13.250 に答える
2

これを行う1つの方法は次のとおりです。

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 ループです。

于 2013-09-16T12:46:33.737 に答える