ループに変数識別子を割り当て、その値をエコーし​​ます。

ループに変数識別子を割り当て、その値をエコーし​​ます。

この問題を解決するためにさまざまな方法を試しましたが、解決策が見つからないため、この質問が重複しないことを願っています。

各ラウンドごとに名前が変更された変数にコマンド出力を保存してエコーし、これらの変数に対して次のようにさらに作業したいforループがあります。

for i in `seq 1 $netsize`
do
    echo "node$i: "
    export Bal$i=$(node$i getbalance | bc)  #PIPE TO BC SINCE getbalance RETURNS FLOAT TYPE VALUE
    echo $Bal$i | tee -a <text-file path>   #THIS GIVES ME ONLY 1,2,... NOT THE getbalance VALUE!!!
...

また、node1のgetbalanceを取得し、すべてのノードの合計残高の合計に分割したいと思います。だからこれをしましたが、構文エラーが発生しました。

...
echo "$Bal1/($Bal1+$Bal2+$Bal3+$Bal4+$Bal5+$Bal6+$Bal7+$Bal8+$Bal9)" | bc >> <text-file path> #HERE; I DO THIS FOR A netsize OF 9 NODES ...

任意のネットワークサイズに関する2番目の問題をどのように解決しますか?

ベストアンサー1

bash配列を使用してこれを行うことができます。この値を次のようにインデックス配列に格納します。

declare -a bal
for i in `seq 1 $netsize`
do
    echo "node$i: "
    bal[$i]=$(node$i getbalance | bc) //PIPE TO BC SINCE getbalance RETURNS FLOAT TYPE VALUE

    echo ${bal[$i]} # should be the right value
done

その後、エコーしたいコマンドを組み合わせると、bcサブシェルなどを使って小さなIFSゲームをすることになります。

denominator=$(IFS=+; echo "${bal[*]:2}")
equation="${bal[1]}/($denominator)"

設定すると、次のステートメントでそのフィールドをエコーすると、配列内のIFS=+フィールドが分​​離されます。配列のすべての要素(たとえば、一部)に+アクセスします。ただし、この場合、要素番号1が方程式の分子に使用されるため、スキップしたい要素であることがわかっているので、indexから始まる要素を追加します。したがって、配列インデックス2以上ですべての要素が取得されます。${bal[*]:2}bal${bal[*]}:22${bal[*]:2}bal

Bash 配列スライシングの詳細を見ることができます。これらの答えの中で以上ここ

おすすめ記事