zsh,同时使用浮点算法在三层嵌套循环中过早退出循环

2 floating-point shell zsh

我有一个zsh脚本,该脚本应生成一堆Z矩阵文件,但在一次迭代后退出while循环。N和M从不增加

#!/bin/zsh
n=0.5 
m=0.5
a=60.0
i=1

while [[ $n -le 1.5 ]];do
    while [[ $m -le 1.5 ]];do
        while [[ $a -le 160 ]];do
            echo $i
            echo "o" > H2O.$i.Z
            eval echo "h  1" $n >> H2O.$i.Z
            eval echo "h  1" $m "2" $a >> H2O.$i.Z

            let i=$i+1
            let a=$a+5.0
        done
        let m=$m+0.05
    done
    let n=$n+0.05
done
Run Code Online (Sandbox Code Playgroud)

我是zsh的新手。我的语法错误吗?

Jen*_*ens 5

-le操作上整数操作。对于浮点,请使用内置算法。我也相信您可能实际上想重新初始化ma内循环中的值。然后的错误是,您仅在开始时对其进行了一次初始化,并且第二次迭代的内部循环条件为假。

您可以使用for((;;))循环将其编写得更紧凑:

#!/usr/local/bin/zsh
i=1
for ((n=0.5; n <= 1.5; n+=0.05)); do
  for ((m=0.5; m <= 1.5; m+=0.05)); do
    for ((a=60.0; a <= 160; a+=5.0)); do
      echo $i $a $m $n
      let i=$i+1
    done
  done
done
Run Code Online (Sandbox Code Playgroud)

还要注意,将浮点数用作循环计数不明智的。您知道十乘0.1几乎不是一个吗?这可以解释为什么您会丢失或获得额外的迭代。相反,您应该使用整数N进行迭代,并将所需的浮点数计算为例如0.5 + N * 0.05。