aws cli 명령 출력을 사용하는 while 루프의 잘못된 산술 연산자

aws cli 명령 출력을 사용하는 while 루프의 잘못된 산술 연산자

현재 AWS SSM 명령을 통해 다수의 Windows 인스턴스를 패치하고 다시 시작하고 있지만 SSM 에이전트가 항상 체크인하지 않는 문제가 있습니다. 내 생각은 작업 속도를 높이는 것입니다. 각 패치에서 while 루프 그룹을 실행하여 그룹의 각 인스턴스에 대한 가동 시간을 끌어올 수 있습니다. 모든 인스턴스가 2분 동안 작동되면 다음 그룹이 다시 시작됩니다. 이 작업을 수행하기 위해 while 루프를 올바르게 만드는 방법에 대한 간단한 질문을 이해할 수 없는 것 같습니다.

다음 명령을 bash 스크립트로 실행할 때 루프에서 "잘못된 산술 연산자"를 사용하려고 한다는 오류가 표시됩니다. 저는 $upTime 값인 "18"을 출력하여 이를 테스트했습니다.

이것은 내가 너무 많은 시간을 낭비하고 누군가가 내가 뭘 잘못하고 있는지 재빠르게 지적한 작은 혼란 중 하나인 것 같습니다. $upTime의 출력이 숫자인 경우 루프에서 더 적은 값이 작동할 것이라고 가정합니다. 18로 하드 설정하면 올바르게 반복되므로 SSM 명령에 이상한 형식 문제가 있는 것 같지만 일반 텍스트여야 하며 테스트 결과 공백이 통과되지 않습니다.

#!/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

upTime=1

while [[ $upTime -le 120 ]]
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 ","$uptimeSeconds = ($wmi.ConvertToDateTime($wmi.LocalDateTime)-$wmi.ConvertToDateTime($wmi.LastBootUpTime) | select-object -expandproperty \"TotalSeconds\")","[int]$uptimeSeconds"],"workingDirectory":[""],"executionTimeout":["3600"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region us-west-2 --output text --query "Command.CommandId")

echo "Value of ssmID = $ssmID"

echo "Value of upTime before sleep = $upTime"

sleep 15

upTime=$(aws ssm list-command-invocations --command-id "$ssmID" --details --query "CommandInvocations[].CommandPlugins[].{Output:Output}" --output text)

echo "Value of upTime after command invocation = $upTime"

echo "Waiting for instance uptime of 2 minutes before continuing"
done

답변1

거기에 잘못된 캐리지 리턴이 있을 것입니다.

$ upTime=$'42\r'
$ [[ $upTime -le 120 ]] && echo y || echo n
")syntax error: invalid arithmetic operator (error token is "
n

그리고 오류로 인해 [[0이 아닌 값이 반환되고 while 루프가 너무 빨리 종료됩니다.

이 시도:

printf "Value of upTime after command invocation = %q\n" "$upTime"

내 말이 맞다면 매개변수 확장을 통해 CR을 삭제할 수 있습니다.

upTime=${upTime%$'\r'}

또는 sed를 사용하십시오

upTime=$(aws ... | sed 's/\r$//')

관련 정보