配列内の各値の割合(80%を超える場合はメッセージを表示)

配列内の各値の割合(80%を超える場合はメッセージを表示)

ディスクの1つのアーカイブの割合が80%を超える場合は、エラーメッセージを受信しようとします。したがって、ディスクパーティションデータを含む2つのアレイがあります(この例のように、パーティションは3つ以上の場合がありますが、10個未満の場合もあります)。常に直列に接続されており、1:1に対応しています。使用可能なアレイディスクの最初の要素は使用されているディスクの1つの要素に対応し、2は2番目の要素に対応します。

array1をdisk_availableとして使用する(常にこの例と同じではありません)

array1=($(curl -ks -XGET https://API/cluster1| awk '/disk_space_available/ {print $5}'))
echo "${array1[*]}"
65536 65536 65536

そしてarray2はdisk_space_usedとして使用されます。

array2=($(curl -ks -XGET https://API/cluster1| awk '/disk_space_used/ {print $5}'))
echo "${array2[*]}"
34856 11672 34994

disk_space_used(34856)の最初の要素がdisk_available(65536)の最初の要素の80%以上を表すことを確認しようとしています。 80%未満の場合は2番目の要素に移動して確認し、それ以外の場合はエラーメッセージが表示されます。 2 つ以上のパーティション (配列 2 の要素) Used_disk が available_disk (配列 1 の要素) で使用可能なパーティションの 80% より大きい場合は、他の配列/リスト/何でも保存して後ですべて印刷できます。

私はこれを試しましたが失敗しました。パーセンテージ部分は正確ではなかった(どこかのスタック交換で得られた)。このコードは私の試みに過ぎず、再現できず、さまざまな方法で間違っている可能性があります。

for index in "${!array1[*]}"
    do 
    percent=$(( 100 * ${array2[$index]} / ${array1[$index]} + (1000 * ${array2[$index]} / ${array1[$index]}  % 10 >= 5 ? 1 : 0) ))
    if [ "$percent" -gt 80 ]; then
    a0+=("FAIL - Storage is $percent% full")
    fi
    done

ベストアンサー1

一般に、パーセンテージ操作にはフル/使用が必要であり、使用可能/使用は必要ありません!

配列またはパラメータで@の代わりに*を使用すると、繰り返すことができない文字列が得られます。

とにかくこれを試してみてください

#get data from api save it to variable in order to avoide calling it twice (resources consumption and asyncroned results)!
disk_infos="$(curl -ks -XGET https://API/cluster1)";
# extract disk_space_available frome results 
disk_available=($(awk '/disk_space_available/ {print $5}' <<< "${disk_infos}"));
# extract disk_space_used from same results 
disk_used=($(awk '/disk_space_used/ {print $5}' <<< "${disk_infos}"));
# declare empty array for holding errors
disk_errors=();
# loop over arrays
for i in "${!disk_used[@]}";do 
    used_perc=$((disk_used[i]*100/disk_available[i])); # calculate percentage
    if [[ "${used_perc}" -gt 80 ]]; then # check perc value if greeter than 80
        disk_errors+=("FAIL - Storage is ${used_perc}% full at index ${i}"); # append the error to the holder 
    fi
done
# check if errors were encountred
if ((${#disk_errors[@]}));then # check if disk_errors count is not 0
    echo ${#disk_errors[@]} errors found; # print errors count
    printf '%s\n' "${disk_errors[@]}" ; # print each error msg in a line
else
    echo everything is fine ${#disk_errors[@]} errors found; # print errors count 
fi

おすすめ記事