如果其中一个磁盘的归档率超过 80%,我会尝试收到一条错误消息。因此,我们有两个包含磁盘分区数据的数组(它们可以有 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%,则转到第二个元素并检查它,依此类推,否则弹出错误消息。如果超过 1 个分区(数组 2 的元素)used_disk 大于 available_disk(数组 1 的元素)中可用分区的 80%,则将其保存在另一个数组/列表/任何内容中,以便我们之后可以将它们全部打印出来。
我尝试了这个,但它失败了,百分比部分不太正确(从 stackexchange 的某个地方得到的):这段代码只是我的尝试,不可重现,并且可能在不止一种方面是错误的。
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