1

嗨,我有以下代码:

#!/bin/bash
atmo =`echo "-5000*l(10^-6)" | bc -l`
echo "Threshold: $atmo m"
for altitude in {70000..0..10}
do
  if [[ $altitude < $atmo ]]; then
    printf "A %.1f m\n" "$altitude"
  else
    printf "B %.1f m\n" "$altitude"
  fi
done

因此,如果altitude它太高(大约 69077)它应该进入 else 分支。现在这实际上一直有效,直到altitude失去一个有效数字(例如从 10000 切换到 9990)。然后它开始转到 else 分支,直到altitude低于 的十分之一atmo。当高度从 1000 切换到 990 时,再次发生这种情况。它再次进入 else 分支,直到高度低于百分之一atmo,依此类推。

所以基本上是:

  • 70000 到 69080:else 分支(正确)
  • 69000 到 10000:如果分支(正确)
  • 9990 到 6910:else 分支(不正确
  • 6900 到 1000:如果分支(正确)
  • 990 到 700:else 分支(不正确
  • 690 到 100:如果分支(正确)
  • 90 到 70:else 分支(不正确
  • 60 到 0:如果分支(正确)

现在的问题是如何解决这种奇怪的行为?

4

1 回答 1

3

问题是[[ $altitude < $atmo ]]进行字符串比较。$atmo是 69077,它按字母顺序出现在 700 之前和 100000 之后,因此会给您带来奇怪的结果。

Bash 不支持小数,所以你也可以bc用来比较:

if (( $(bc -l <<< "$altitude < $atmo") ))
then
  printf "A"
else
  printf "B"
fi
printf " %.1f m\n" "$altitude"
于 2013-11-10T17:42:24.133 回答