Bashループインデックスを浮動小数点に変換

Bashループインデックスを浮動小数点に変換

ifor i in {0..10..5}たとえば、浮動小数点計算などのループでインデックス付けを使用する必要があります。 iを浮動小数点数に変換する最も簡単な方法は何ですか?
変化

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

動作しません。

答え1

bc浮動小数点をサポートするか、awkまたはシェルを使用します(たとえばksh93zshまたはyash代わりに)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 '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カンマを入れても同じ結果が出ます。


実際に浮動小数点数を使用するには、他の言語または一部のシェルに変更する必要があります。

小数点を表示するには点を使用してください。

$ 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

浮動小数点数は、ローカル小数点区切り文字を使用して割り当てる必要があります。
ただし、$(( ))ポイントは内部的に使用する必要があります。

関連情報