aws cliコマンドjson出力で稼働時間値を確認するためのbash配列の構築に問題がある

aws cliコマンドjson出力で稼働時間値を確認するためのbash配列の構築に問題がある

AWS SSM実行ドキュメントの出力を取得するAWS CLIコマンドの出力を収集するために、bash 4プロンプトでコマンドを実行しています。テキストやjson(デフォルト)を含む複数の形式で出力できます。これまで、配列の各値が2以上になるまで出力を繰り返すことができるように、この出力を配列に入れようとしましたが、まだ成功していません。

#!/bin/bash

aws ec2 reboot-instances --instance-ids `aws ec2 describe-instances --filters "Name=tag:RebootGroup,Values=01" --query 'Reservations[].Instances[].InstanceId' --output text`

sleep 30

completeLoop=false

while [ ! ${completeLoop} ]
do
    ssmID=$(aws ssm send-command --document-name "AWS-RunPowerShellScript" --document-version "1" --targets '[{"Key":"tag:RebootGroup","Values":["01"]}]' --parameters '{"commands":["$wmi = Get-WmiObject -Class Win32_OperatingSystem ","$uptimeMinutes = ($wmi.ConvertToDateTime($wmi.LocalDateTime)-$wmi.ConvertToDateTime($wmi.LastBootUpTime) | select-object -expandproperty \"TotalMinutes\")","[int]$uptimeMinutes"],"workingDirectory":[""],"executionTimeout":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-west-2 --output text --query "Command.CommandId")

    declare -a a
    readarray -t upTimeArray <<< $(aws ssm list-command-invocations --command-id "$ssmID" --details --output json | jq '.CommandInvocations[].CommandPlugins[].Output')

    if [[ " ${upTimeArray[@]} " -gt 5 ]]; then
        echo "Uptime is greater than 5 minutes."
        completeLoop=true
    else
        completeLoop=false
    fi

done

ここでは少し進歩がありましたが、今は出力からキャリッジリターン/新しい行を削除する方法を理解しようとしています。

これは、配列内の項目の値のみを出力するように縮小された私の配列です。私は各行から '\ r \ n'を削除するためにsedを使用する必要があると仮定していますが、これを行うのに問題があります。

declare -a a

readarray -t upTimeArray <<< $(aws ssm list-command-invocations --command-id "$ssmID" --details --output json | jq '.CommandInvocations[].CommandPlugins[].Output')

for i in "${upTimeArray[@]}"
do
  echo $i
done

次を返す

"1\r\n"
"1\r\n"

各行が2以上になるまで配列を繰り返すことができるように、各行に対して「1」のみを返す必要があります。


編集#2

ここで提供された助けを借りて進めましたが、最終的には2番目の質問の問題とスクリプトの問題を完全に解決しました。https://stackoverflow.com/questions/65362975/bash-aws-cli-trying-to-Figure-out-how-to-validate-an-array-of-uptimes-with-2-ch

答え1

実際にはループに入らない。

$ completeLoop=false
$ while [ ! $completeLoop ]; do date; done; echo complete
complete

[単一の引数(shelf!とtrailing ])が与えられた場合、引数が空でない場合、コマンドは成功を返します。 「true」も「false」も空ではありません。

truesumコマンドの実際のブール結果を処理するには、false以下を省略します[

completeLoop=false
count=0
# ....vvvvvvvvvvvvvvv
while ! "$completeLoop"; do
  echo in loop
  (( ++count == 5 )) && completeLoop=true
done
echo complete
in loop
in loop
in loop
in loop
in loop
complete

欲しい

readarray -t upTimeArray < <(
   aws ssm list-command-invocations --command-id "$ssmID" --details --output json |
     sed $'s/\r$//' |
     jq -r '.CommandInvocations[].CommandPlugins[].Output'
)

sedを使用して末尾のキャリッジリターンを削除し(改行文字は自動的に処理されます)、引用符jq -rなしで「生」の値を出力します。

次はリダイレクト中です。プロセスの交換ここでは文字列の代わりに。結果は同じです。

$(...)読みやすくするために、内部に余分なスペースを追加できます。

関連情報