디스크 중 하나의 아카이브 비율이 80%를 초과하는 경우 오류 메시지를 받으려고 합니다. 따라서 디스크 파티션 데이터를 포함하는 두 개의 어레이가 있습니다(이 예에서와 같이 파티션이 3개 이상일 수 있지만 10개 미만일 수 있음). 항상 직렬로 연결되어 있으며 1:1로 대응됩니다. 사용 가능한 어레이 디스크의 첫 번째 요소는 사용된 디스크의 1개 요소에 해당하고, 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의 요소) 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