将 bash 循环索引转换为浮点型

将 bash 循环索引转换为浮点型

i我需要在循环中使用索引,例如for i in {0..10..5}在浮点计算中。将 i 转换为浮点数的最简单方法是什么?
的变化

i=$(bc -l <<< "scale=7;$i")

不工作。

答案1

使用bcorawk或 具有浮点支持的 shell,例如ksh93, zshoryash代替bash

公元前

$ bc -l << \EOF
heredoc> for (i = 0; i <=  10; i += 2.5) i / 2
heredoc> EOF
0
1.25000000000000000000
2.50000000000000000000
3.75000000000000000000
5.00000000000000000000

awk

$ awk 'BEGIN {for (i = 0; i <= 10; i += 2.5) print i / 2}'
0
1.25
2.5
3.75
5

桀骜

$ float i; for ((i = 0; i <= 10; i += 2.5)) print $((i/2))
0.
1.25
2.5
3.75
5.

克什93

$ for ((i = 0; i <= 10; i += 2.5)); do print "$((i/2))"; done
0
1.25
2
3.75
5

(请注意,小数点分隔符取决于区域设置(.,)。

亚什

i=0; while [ "$((i <= 10))" -ne 0 ]; do
  echo "$((i / 2))"
  i=$((i + 2.5))
done

(在内部$((...))用作小数点分隔符,但在 I/O 上,则使用.区域设置的 1 (.或))。,


编辑

现在,如果您只想循环一些整数并且这些整数用小数点表示,只需附加一个.0

 for i in {0..10..5}.0

或者对于上面的解决方案,使用printf "%.7f\n"代替print/echo来输出小数点分隔符后 7 位数字。

答案2

您需要将该值除以 bc 中的某个值(甚至 1)才能得到重要的比例:

$ i=5; bc -l <<< "scale=7;$i/1"
5.0000000

$  i=5; bc -l <<< "scale=7;$i/2"
2.5000000

编辑:

对于特殊情况 0(默认情况下不添加.0000000),您可以添加:

$ [ "$i" -eq 0 ] && i="0.0000000"

谨防这不会使该值成为浮点数,而只是看起来类似于浮点数的字符串。

另外,您可以获取printf所需的表示:

$ i=3.75
$ i=$( printf "%.7f\n" "$i" )
$ echo "$i"
3.7500000

考虑到 bash printf 将遵循本地小数分隔符。如果它是一个逗号,你应该写i=3,75,你会得到同样带有逗号的结果。


您需要更改为其他语言或某些 shell 才能实际使用浮点数:

使用点表示小数。

$ awk 'BEGIN { i=5; print( i / 2 ); i=7; print( i / 3 ) }'
2.5
2.33333

尊重区域设置。

$ float i; i=7; print $((i/2)); print $((i/3)); print $((3,7/2))
3,5
2,33333333333333333
1,85

.即使在使用逗号的语言环境中,zsh 也会使用点,

$ float i; i=7; print $((i/2)); print $((i/3))         ### or typeset -f i
3.5
2.3333333333333335

$ echo $(( 7/3 )); echo $(( 7.0/3 ))
2
2,33333333333333

$ i=7; echo $(( i/3 )); i=7,0; echo $(( i/3 ))
2
2,33333333333333

浮点数字应使用区域小数分隔符进行分配。
但是,内部$(( ))必须使用点。

相关内容