用于在范围中创建一组值的shell脚本

时间:2017-06-28 12:01:21

标签: bash shell

我正在尝试使用Shell脚本在一个范围内创建一组3个值,如下所示。

值范围:512 -885

列差异:12

行增量:3

512 524 536
515 527 539
518 530 542
......
860 872 884
863 875 513  --> Column 3 Reset
866 878 516
869 881 519
872 884 522
875 513 525  --> Column 2 Reset
878 515 528
881 518 531
884 521 534
513 524 537
....

我尝试使用这个内联脚本来生成上面的输出,但它没有一次又一次地给出循环。

for ((i=512; i<=849; i=i+3));do echo $i `expr $i + 12` `expr $i + 24`;done

5 个答案:

答案 0 :(得分:2)

我认为这会产生你需要的东西。

#! /bin/bash

lines=1000

start=512
stop=885
colinc=12
rowinc=3
delta=$((stop-start+1))

for ((i = 0; i < lines; i++)); do
  for j in 0 1 2; do
    c[j]=$(( start + (i * rowinc + j * colinc) % delta ))
  done
  echo ${c[@]}
done

您需要模运算%才能使溢出正确。为了得到正确的序列,你必须将第i行增量和第j列增量相加。你必须按区间​​大小取除除法的余数。最后你必须添加起始偏移量。

答案 1 :(得分:0)

不完全确定您的完整要求,请您试着跟随并告诉我这是否对您有所帮助。

awk -v start=512 -v end=885 'BEGIN{while(start+24<=end){print start,start+12,start+24;start+=3}}'

所以在这里提供起点和终点的开始和结束变量,然后在这里使用BEGIN部分,我在这里开始一个while循环,它从start变量的值运行到end变量的值。所以在这里这个while循环我打印开始,开始+ 12,根据你的要求开始+24值然后用while循环每次迭代增加3个起始变量。

PS: awk中的BEGIN部分不需要读取任何Input_file。

答案 2 :(得分:0)

不知道你是否想要一个无限循环,我还是会对它进行拍摄。

declare -i min=$1
declare -i max=$2

for ((i=$min; i<=$max; i+=3)); do
   [ -z $j ] && declare -i j=$((min+12)) || j+=3  # initialize or increment
   [ $j -gt $max ] && j=$min                      # reset if it's over max
   [ -z $k ] && declare -i k=$((min+24)) || k+=3  # initialize or increment
   [ $k -gt $max ] && k=$min                      # reset if it's over max

   echo -e "$i\t$j\t$k"                           # output with tabs
done

当第一列超过最大值时终止,但它符合您要求的(到目前为止)。我不是硬编码值的粉丝,所以我已将它们移出来传递参数,但你也可以在循环外设置min / max。

答案 3 :(得分:0)

以下代码对我有用。请检查它是否适合您:

#!/bin/bash

MAX_COLS=3 # number of columns to display

range_min=512
range_max=885

col_diff=12
col_incr=3

max_lines=500 # change it to the maximum number of lines you want to print

#set -x
range_delta=`expr $range_max - $range_min`

for ((line=0; line<max_lines; line++)); do
    value=`expr \( $col_incr \* $line \) % $range_delta + $range_min`
    echo -n $value " "
    for ((col=1; col<MAX_COLS; col++)); do
        value=`expr $value + $col_diff`
        if [ $value -gt $range_max ]; then
            value=`expr $value - $range_max + $range_min - 1`
        fi
        echo -n $value " "
    done
    echo
done
#set +x

答案 4 :(得分:0)

我是初学者,所以下面是我所做的代码。

#!/bin/bash

start=512
end=885
incr=12
col1=$start
col2=$(($col1+$incr))
col3=$(($col2+$incr))
colincr=3
for z in {1..500}
do
    if [ $col1 -gt $end ]
    then
         col1=$(($(($col1 % $end))+$start-1))
    fi
    if [ $col2 -gt $end ]
    then
         col2=$(($(($col2 % $end))+$start-1))
    fi
    if [ $col3 -gt $end ]
    then
         col3=$(($(($col3 % $end))+$start-1))
    fi
    printf '%-4s%-4s%-4s\n' $col1 $col2 $col3
    col1=`expr $col1 + $colincr`
    col2=`expr $col2 + $colincr`
    col3=`expr $col3 + $colincr`

done