配列に対する反復

配列に対する反復

プールの状態を確認するには、スクリプトを作成する必要があります。各プールは次の検査結果を返します。

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 

それぞれを繰り返してスキャンが完了したことを確認する必要があります。両方が含まれている場合 スクラブ修理それでは何かをしてみてください。進行中のタスクが1つまたは2つある場合は、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配列に保存しないでください。配列は便利ですが、シェルスクリプトを移植不能にします。
  • 配列の代わりに外部ファイル()に各トレースを保存します(infile1行に1つのトレース)。

アレイを外部ファイルに置き換えるには、上記の2つの簡単な修正が必要です。

  • 「shebang」の直後の2行は次のように置き換えられます。
    pools_to_complete=$(wc -l infile)
  • ブロック内の最初の行は次whileのとおりです。
    pools_completed=$(grep -c "scrub repaired" < infile)

infile配列の使用に固執する場合、上記のすべては、1行あたりまたは各配列コンポーネントに「scrub Repaired」文字列のインスタンスが0または1つしかないことを前提としています。grep -c ...検索されたパターンの発生回数をカウントするためです。ファタイ

おすすめ記事