配列の各要素を指数化し、bashの新しい配列に出力を保存します。

配列の各要素を指数化し、bashの新しい配列に出力を保存します。

分数(最初のループから分数が計算されます)を小数点以下の二乗(2番目のループ)に上げたいのですが、結果は常に1です。また、2番目のループの出力を配列に保存したいと思います。この問題を解決する方法についてのアイデアはありますか?ありがとうございます!

#
# vector of vertical pressure levels
levs=($(seq 200.0 50.0 900.0))
printf "%s\n" "${levs[@]}"
#
# exponent for dry air
rho=$(bc -l <<<'e(l(0.0819)*0.5)')
echo $rho
#
# calculate fraction of P_surf/P_i from Poisson equation for each vertical pressure level
val3=()
#
for i in "${levs[@]}"
 do
   echo $i
   val3+=($(bc -l <<<"1000.0/$i"))
   echo "$val3"
 done
printf "%s\n" "${val3[@]}"
#
# raise fraction of P_surf/P_i to the rho power for dry air (#bc <<< "2 ^ 3")
pow=()
#
for j in "${val3[@]}"
 do
   echo $j
   echo $rho
   pow+=($(bc <<<"$j^rho"))
   #echo $((i*rho))
   echo "$pow"
 done
# 

答え1

試みに関連するいくつかの問題があります。これを二乗定数に上げるときの即時の質問は、それをrhoリテラル文字列として使用することです。bc

bc <<<"$j ^ $rho"

それにもかかわらず、コードは機能せず、bc素数を指数関数として使用しません。エラーが発生しますnon-zero scale in exponent

awk同じコンテンツを使用し(GNUバリアントでテストされている)、同じ精度フォーマットを適用できます。

awk -v base="$j" -v xp="$rho" 'BEGIN{ printf "%.20f", base ** xp }'

関連情報