배열에 대한 반복

배열에 대한 반복

풀 상태를 확인하려면 스크립트를 만들어야 합니다. 각 풀은 다음 검사 결과를 반환합니다.

pool1 - scan: scrub repaired 0 in 0 days 00:06:17 with 0 errors on Thu Sep 
pool2 - scan: scrub in progress since Thu Sep 
pool3 - scan: scrub repaired 0 in 0 days 00:04:02 with 0 errors on Thu Sep 
pool4 - scan: scrub repaired 0 in 0 days 00:04:22 with 0 errors on Thu Sep 

각각을 반복하여 스캔이 완료되었는지 확인해야 합니다. 둘 다 포함되어 있으면 스크럽 수리그럼 뭔가를 해보세요. 진행 중인 작업이 한두 개 있으면 5초마다 확인하고 모두 완료될 때까지 기다려야 합니다. 지금까지는 do/until 루프가 없습니다.

declare -a scans=("pool1 - scan: scrub repaired 0 in 0 days 00:06:17 with 0 errors on Thu Sep" 
"pool2 - scan: scrub in progress since Thu Sep"
"pool3 - scan: scrub repaired 0 in 0 days 00:04:02 with 0 errors on Thu Sep" 
"pool4 - scan: scrub repaired 0 in 0 days 00:04:22 with 0 errors on Thu Sep"

for scan in "${scans[@]}"; do
    echo "$scan"
    if ![[ $scan == *"scrub repaired"* ]]; then
            echo "Scan in progress. Waiting.."
    elif [[ $scan == *"scrub repaired"* ]]; then
            echo "Scan is ready. Saving it somewhere for documentation"
            
    else
            continue
    fi
    break
done

답변1

이에 대해 조사하는 데 몇 시간을 보냈으므로 여기에 원래 아이디어에서 크게 벗어나지 않는 최적화되지 않은 솔루션이 있습니다.

#!/usr/bin/bash

declare -a scans=("pool1 - scan: scrub repaired 0 in 0 days 00:06:17 with 0 errors on Thu Sep" "pool2 - scan: scrub in progress since Thu Sep" "pool3 - scan: scrub repaired 0 in 0 days 00:04:02 with 0 errors on Thu Sep" "pool4 - scan: scrub repaired 0 in 0 days 00:04:22 with 0 errors on Thu Sep")

pools_to_complete=${#scans[@]}
pools_completed=0

while ! [ "$pools_completed" == "$pools_to_complete" ]; do
    pools_completed=$(grep -c "scrub repaired" < <(for scan in "${scans[@]}"; do printf "%s\n" "$scan";done))

    if [ "$pools_completed" == "$pools_to_complete" ]; then
        printf "All %s scans are complete. Saving it somewhere for documentation\n" "$pools_to_complete"
    else
        printf "Scan in progress. Waiting...\n"
        sleep 5
    fi
done

위의 것보다 더 잘할 수 있습니다. 귀하의 접근 방식에 대한 주요 변경 사항은 다음과 같습니다.

  • 각 풀 프로세스의 실행 추적(완료 또는 불완전)을 Bash 배열에 저장하지 마세요. 배열은 유용하지만 쉘 스크립트를 이식 불가능하게 만듭니다.
  • 배열 대신 외부 파일( )에 각 트레이스를 저장합니다( infile한 행에 하나의 트레이스).

어레이를 외부 파일로 교체하려면 위의 두 가지 간단한 수정이 필요합니다.

  • "shebang" 바로 뒤의 두 줄은 다음으로 대체됩니다.
    pools_to_complete=$(wc -l infile)
  • 블록 내부의 첫 번째 줄은 다음 while과 같습니다.
    pools_completed=$(grep -c "scrub repaired" < infile)

infile배열 사용을 고집하는 경우 위의 모든 내용은 행당 또는 각 배열 구성 요소에 "scrub Repaired" 문자열의 인스턴스가 0 또는 1개만 있을 수 있다고 가정합니다. grep -c ...검색된 패턴의 발생 횟수를 카운트하기 때문입니다 . 화타이

관련 정보