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}