Bash 嵌套for循环没有按我期望的方式迭代

Bash 嵌套for循环没有按我期望的方式迭代,bash,for-loop,Bash,For Loop,我有一个脚本,它从输入文件中获取最后一行,并迭代地将定义的步长值添加到该行的某些数据字段中。外循环将步骤添加到第一个数据字段,嵌套的内循环将步骤添加到第二个数据字段。然后,旧的数据字段值被替换为新的值,并且新行仅在本论坛中回显到我的命令行上。最后,我将旧输入文件中的数据复制到新文件中,删除最后一行,并追加新的最后一行 #!/bin/bash step=0.1 inputfile=$1 limit_i=2 limit_j=2 lastline=$(awk END{print}<$inpu

我有一个脚本,它从输入文件中获取最后一行,并迭代地将定义的步长值添加到该行的某些数据字段中。外循环将步骤添加到第一个数据字段,嵌套的内循环将步骤添加到第二个数据字段。然后,旧的数据字段值被替换为新的值,并且新行仅在本论坛中回显到我的命令行上。最后,我将旧输入文件中的数据复制到新文件中,删除最后一行,并追加新的最后一行

#!/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.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号线和3号线的同样问题也在影响它。似乎出于某种原因,对于它的第一次传递,外部循环没有保留其值并允许内部循环完全通过,而是迭代并保留内部循环值。我做过很多谷歌搜索,也和一些人交谈过,但都不知道这个bug是什么。我已经在这个问题上纠缠了一段时间了,如果有任何解决方案的建议,我将不胜感激。

第二条输出线出现错误,第三条输出线出现类似错误。。。那是你的吗

      lastline_new_xy=${lastline_new_x/$y0/$ynew}
您希望将第二个数据字段y0(0.0000000000000000)替换为ynew 0.100000000000000,但由于第一个数据字段也是0.0000000000000000,并且${parameter/pattern/string}模式替换仅替换第一个匹配项,因此

  0.1000000000000000  0.0000000000000000  1.2000000000000000   T   T   T
而不是

  0.0000000000000000  0.1000000000000000  1.2000000000000000   T   T   T
有无数种方法可以解决这个问题,但最快的可能是将上面的脚本行更改为

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

有趣的代码,但在awk中一次完成。所有这些变量=$…|。。。价格昂贵。祝你好运。至少,使用参数展开和/或读取来提取部分值,而不是管道到awk中。0.1不能用默认的浮点表示法准确表示,因此你会得到各种舍入错误。试试这个:awk'BEGIN{printf%.20f,0.1}'-如果可能的话,将你的算法修改为递增一个整数,然后除以10表示。谢谢大家的评论。这是我的第一个脚本,所以我仍在学习,并感谢有机会做出改进。我会试试这些建议!
      lastline_new_xy=${lastline_new_x/$xnew  $y0/$xnew  $ynew}