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

여기에 제공된 도움으로 진행했지만 결국 두 번째 질문의 문제와 스크립트 문제를 완전히 해결했습니다.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따옴표 없이 "원시" 값을 출력합니다.

다음에서 리디렉션 중입니다.프로세스 교체여기에 문자열 대신. 결과는 동일합니다.

$(...)가독성을 위해 내부에 추가 공백을 추가할 수 있습니다.

관련 정보