Bash配列で小数値を使用しようとすると停止する

Bash配列で小数値を使用しようとすると停止する

以下は簡単なテストコードです。

#!bin/bash 
cpm=(0 1 0.094)
lv=1
attack=5
defense=9
stamina=16
echo $((cpm[lv]))
mycpm=$((cpm[lv]))
#mycpm=`echo "0.094" | bc -l`
cq=`echo "$attack*$defense*1/10*sqrt($stamina)*2^2*$mycpm" | bc -l`
echo $cq

ターミナル出力:

bash testing.sh
1
72.00000000000000000000

わかりました。

その後、3行目を次に変更するとlv=2

bash testing.sh
testing.sh: line 7: 0.094: syntax error: invalid arithmetic operator (error token is ".094")
testing.sh: line 8: 0.094: syntax error: invalid arithmetic operator (error token is ".094")
(standard_in) 2: syntax error

それでは、配列で素数をどのように使用する必要がありますか?徳徳ゴインについては何も見つかりません。最も近いのはforループ配列チェーンで、ここでステップごとに+0.1を繰り返す方法を見つけます。それ以外の場合、そのチュートリアルはすべて整数を使用します。式で使用するために値を取得する必要がある事前設定された配列があります。

実際に$ mycpmを0.094に変更すると、10行が機能します。評価が良いでしょう。配列を使用してこの値を取得できる場合は、これが問題です。

bashで達成したいことは可能ですか?

ベストアンサー1

ここでの問題は配列ではありません。実際、bashは整数ではなく数値の算術評価をサポートしていません。スカラー変数またはスカラー定数に対しても同じエラーが発生します。

$ bash -c 'echo $((0.094))'
bash: 0.094: syntax error: invalid arithmetic operator (error token is ".094")

他のいくつかのシェル、特にzsh、ksh93、yashはこれをサポートしていますが、ksh93とyashは独自の方法でロケールの小数点基本文字を尊重し、引用符なしの算術拡張はksh93とyashの両方でIFS分割を受けますように)。

$ zsh -c 'echo $((0.094))'
0.094
$ LC_ALL=fr_FR.UTF-8 ksh93 -c 'echo "$((0.094))"'
ksh93: 0.094: radix point '.' requires LC_NUMERIC=C
$ LC_ALL=C ksh93 -c 'echo "$((0.094))"'
0.0939999999999999858
$ LC_ALL=fr_FR.UTF-8 ksh93 -c 'echo "$((0,094))"'
0,0939999999999999858
$ LC_ALL=fr yash -c 'echo "$((0.094))"'
0.094
$ LC_ALL=fr_FR.UTF-8 yash -c 'echo "$((0.094))"'
0,094

それでも必要はありません。努力するシェルで式を評価するには、式をそのままにして評価bcされていない値を割り当てます。パラメータ拡張 ${cpm[lv]}変数に:

#!/bin/bash

cpm=(0 1 0.094)
lv=2
attack=5
defense=9
stamina=16
echo "${cpm[lv]}"
mycpm=${cpm[lv]}
#mycpm=$(echo "0.094" | bc -l)
cq=$(echo "$attack*$defense*1/10*sqrt($stamina)*2^2*$mycpm" | bc -l)
echo "$cq"

それから

$ ./testing.sh
0.094
6.76800000000000000000

また、廃止された「backtick」を最新の$(コマンドの代替)に置き換えて、引用符を追加しました。

おすすめ記事