ディスクの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