嵌套for循环不迭代我期望的方式

时间:2014-07-18 18:05:35

标签: bash for-loop

我有一个脚本从输入文件中获取最后一行,并迭代地将定义的“step”值添加到行中的某些数据字段。外部循环将“step”添加到第一个数据字段,嵌套的内部循环将“step”添加到第二个数据字段。然后,旧数据字段值将替换为新值,新行将回显到我的命令行(仅用于此论坛的目的)。最后,我将旧输入文件中的数据复制到新文件中,删除最后一行,然后追加新的最后一行。

#!/bin/bash

step=0.1
inputfile=$1
limit_i=2
limit_j=2

lastline=$(awk END{print}<$inputfile)
x0=$(echo "$lastline" | awk '{print $1}')
y0=$(echo "$lastline" | awk '{print $2}')
for (( i=0; i <= $limit_i; i++))
do
   istep=$(echo "$i*$step" | bc)
   xnew=$(echo "$x0 $istep" | awk '{printf "%.16f", $1+$2}')
   lastline_new_x=${lastline/$x0/$xnew}
   for (( j=0; j <= $limit_j; j++))
   do
      jstep=$(echo "$j*$step" | bc)
      ynew=$(echo "$y0 $jstep" | awk '{printf "%.16f", $1+$2}')
      lastline_new_xy=${lastline_new_x/$y0/$ynew}
      echo "$lastline_new_xy"
   done
done

以下是我对此脚本的期望输出:

  0.0000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.0000000000000000  0.1000000000000000  1.2000000000000000   T   T   T
  0.0000000000000000  0.2000000000000000  1.2000000000000000   T   T   T
  0.1000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.1000000000000000  0.1000000000000000  1.2000000000000000   T   T   T
  0.1000000000000000  0.2000000000000000  1.2000000000000000   T   T   T
  0.2000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.2000000000000000  0.1000000000000000  1.2000000000000000   T   T   T
  0.2000000000000000  0.2000000000000000  1.2000000000000000   T   T   T

然而,实际输出是:

  0.0000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.1000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.2000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.1000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.1000000000000000  0.1000000000000000  1.2000000000000000   T   T   T
  0.1000000000000000  0.2000000000000000  1.2000000000000000   T   T   T
  0.2000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
  0.2000000000000000  0.1000000000000000  1.2000000000000000   T   T   T
  0.2000000000000000  0.2000000000000000  1.2000000000000000   T   T   T

第4 - 9行对我来说很好看。第1行在技术上看起来也很好,但我相信同样的问题影响2&amp; 3也正在影响它。看起来由于某种原因,对于第一次传递,外部循环不保持其值并允许内部循环完全通过,而是迭代并保持内部循环值。我做了很多谷歌搜索并与一些人交谈,但无法弄清楚这是什么bug。我现在已经坚持了一段时间,并且非常感谢任何解决方案的建议。

1 个答案:

答案 0 :(得分:0)

第二个输出行的错误(与第三个输出行类似)是

      lastline_new_xy=${lastline_new_x/$y0/$ynew}

您希望将第二个数据字段(y00.0000000000000000)替换为ynew0.1000000000000000),但由于第一个数据字段也是{{ 1}}和0.0000000000000000模式替换只替换第一个匹配,你得到

${parameter/pattern/string}

而不是

  0.1000000000000000  0.0000000000000000  1.2000000000000000   T   T   T

有无数种方法可以解决这个问题,但最重要的是将上面的脚本行更改为

  0.0000000000000000  0.1000000000000000  1.2000000000000000   T   T   T