배열에 있는 각 값의 백분율(80%보다 큰 경우 메시지 표시)

배열에 있는 각 값의 백분율(80%보다 큰 경우 메시지 표시)

디스크 중 하나의 아카이브 비율이 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

관련 정보