构建 bash 数组以验证 aws cli 命令 json 输出中的正常运行时间值时遇到问题

构建 bash 数组以验证 aws cli 命令 json 输出中的正常运行时间值时遇到问题

我正在 bash 4 提示符下运行命令,以收集拉取 AWS SSM 运行文档输出的 AWS CLI 命令的输出。我可以让它以多种格式输出,包括文本或 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

我在这里取得了一些进展,但现在我试图弄清楚如何从输出中删除回车/新行。

这是我的数组简化为仅输出数组中项目的值。我假设我需要使用 sed 从每行中删除 '\r\n' 但我在这样做时遇到了麻烦。

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"

我需要它为每一行只返回“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

[当给定单个参数(搁置!和尾随])时,如果参数不为空,该命令将返回成功。 “真”和“假”都不为空。

true要对和命令的实际布尔结果执行操作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输出不带引号的“原始”值。

我正在从一个重定向流程替代而不是这里的字符串。结果相同。

$(...)为了可读性,可以在里面添加额外的空格

相关内容